一个关于内存回收的问题

Julykey 2009-10-25 04:17:46
假设有一个类:Line ,它包含了Point 类的头文件
然后Line里成员变量vector <Point*> m_neighborPoint以及下面这个函数

for() //将很多的点放到m_neighborPoint中
{
Point* tempPoint=new Point();
...........//这里是对tempPoint赋值
m_neighborPoint.push_back(tempPoint);
..........
//delete tempPoint;
//tempPoint=NULL;
}
当函数中没有最后两句时,程序正常运行。而添加里以后就报内存错误了
...全文
125 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
cmo_lyl 2009-10-26
  • 打赏
  • 举报
回复
AUTO_PTR
ahao 2009-10-25
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 tadican 的回复:]
如果想要效率,又要改变现有的程序设计,你可以考虑一下用智能指针来管理内存。
[/Quote]

恩,我一般就用boost::shared_ptr或者boost::ptr_container
不过,用了这个,估计LZ头会更大的。
TADICAN 2009-10-25
  • 打赏
  • 举报
回复
如果想要效率,又要改变现有的程序设计,你可以考虑一下用智能指针来管理内存。
gyang_pinner 2009-10-25
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 julykey 的回复:]
引用 4 楼 whg01 的回复:
delete tempPoint; 这句引起的。
m_neighborPoint.push_back(tempPoint); 这里把tempPoint的值添加到了vector里,即vector里增加了一个指针,指向的地址与tempPoint指向的地址相同。
你delete tempPoint,会把tempPoint指向的地址释放。
这样vector里相应的指针就指向了已释放的内存。

好像是这个原因。但是这些tempPoint不用释放内存了吗?
是不是我设计的不好,将Line类的成员变量改成vector <Point> m_neighborPoint是不是可以避免这个问题?
[/Quote]
这样会增加开销,但更安全
hjs2009 2009-10-25
  • 打赏
  • 举报
回复
这样的设计可能存在问题,问题的根源可能在于你申请的与释放的不对称。

解决的方法建议:
重新实现构造与析构函数,保证这二个函数对称。

然后保证 new 与 delete 的对称使用。

在C++中基本上就不会出现以上的内存问题那。
whg01 2009-10-25
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 ahao 的回复:]
。。。你都delete了,还指望不出错?

不需要的时候,再遍历vector,把里面的指针delete
[/Quote]
需要释放时,再从vector里读取指针,然后释放。
ahao 2009-10-25
  • 打赏
  • 举报
回复
。。。你都delete了,还指望不出错?

不需要的时候,再遍历vector,把里面的指针delete
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 cryinwind 的回复:]
你自己new出来的对象,要记住delete掉
你放对象在容器里面就不用了,变量的生命周期结束后就会释放了所占用的空间
[/Quote]
同意6#的说法。c++书中都强调new必要对应一个delete,感觉7#这样会造成内存泄漏,不知是否正确,楼下解答!
vincent_nicole 2009-10-25
  • 打赏
  • 举报
回复
你自己new出来的对象,要记住delete掉
你放对象在容器里面就不用了,变量的生命周期结束后就会释放了所占用的空间
vincent_nicole 2009-10-25
  • 打赏
  • 举报
回复
同意4楼
一样需要释放,需要合适的位置释放就可以了,比如在析构函数里面
vector<Point*>::iterator it = m_neighborPoint.begin();
while ( it != m_neighborPoint.end )
{
delete (*it);
++it;
}
Julykey 2009-10-25
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 whg01 的回复:]
delete tempPoint; 这句引起的。
m_neighborPoint.push_back(tempPoint); 这里把tempPoint的值添加到了vector里,即vector里增加了一个指针,指向的地址与tempPoint指向的地址相同。
你delete tempPoint,会把tempPoint指向的地址释放。
这样vector里相应的指针就指向了已释放的内存。
[/Quote]
好像是这个原因。但是这些tempPoint不用释放内存了吗?
是不是我设计的不好,将Line类的成员变量改成vector <Point> m_neighborPoint是不是可以避免这个问题?
whg01 2009-10-25
  • 打赏
  • 举报
回复
delete tempPoint; 这句引起的。
m_neighborPoint.push_back(tempPoint); 这里把tempPoint的值添加到了vector里,即vector里增加了一个指针,指向的地址与tempPoint指向的地址相同。
你delete tempPoint,会把tempPoint指向的地址释放。
这样vector里相应的指针就指向了已释放的内存。
y_l_stone 2009-10-25
  • 打赏
  • 举报
回复
释放后哪里又访问了?
Julykey 2009-10-25
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 akirya 的回复:]
m_neighborPoint是干啥的,是不是另外又释放了一次?
[/Quote]
是Line类的成员变量,它将在下面的程序中被访问。我并没有显式的去释放。析构函数中也没有
  • 打赏
  • 举报
回复
m_neighborPoint是干啥的,是不是另外又释放了一次?

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧