内存的动态回收

thoreau_zzy 2007-05-22 09:00:12
程序单步调试到最后没有问题
但是推出整个程序的时候出现
在程序结束的时候会提示错误
信息如下
damage:after Normal block (#28710) at 0x003C2CD8

汇编的代码是
0041CA89 add esp,0Ch
0041CA8C mov dword ptr [mainret],eax
0041CA8F mov edx,dword ptr [mainret]
0041CA92 push edx
0041CA93 call exit (00420910)

不知道C++有没有回收内存的办法
C#有CG.Collect();
不知C++有没有类似的东西,谢谢!!
...全文
846 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
lddhbu 2010-09-04
  • 打赏
  • 举报
回复
顶15楼
hamlet0168 2007-06-02
  • 打赏
  • 举报
回复
把代码贴出来,不就都知道了…………
blueice12 2007-06-02
  • 打赏
  • 举报
回复
也可以使用boundcheck调试,一下子就能找到错误代码所在
dai_weitao 2007-05-23
  • 打赏
  • 举报
回复
想自动回收还是用JAVA和.NET吧,我们C++都是手动的。
huzhangyou 2007-05-23
  • 打赏
  • 举报
回复
auto_ptr
shootingstars 2007-05-23
  • 打赏
  • 举报
回复
与内存回收应该没有关系。
内存不回收,不会导致程序异常。
thoreau_zzy 2007-05-23
  • 打赏
  • 举报
回复
期待ing
freeman868 2007-05-23
  • 打赏
  • 举报
回复
关注
thoreau_zzy 2007-05-23
  • 打赏
  • 举报
回复
但是错误是在程序最后出现的
即为main函数推出时候,看汇编的代码
0041CA93 call exit (00420910)
这行出现的错误,我就不懂了
那是什么样的错误呢?
blueice12 2007-05-23
  • 打赏
  • 举报
回复
内存访问越界
spofmy 2007-05-23
  • 打赏
  • 举报
回复
是的
taodm 2007-05-23
  • 打赏
  • 举报
回复
楼主问题和垃圾回收似乎没联系的呀。
flysec 2007-05-23
  • 打赏
  • 举报
回复
这种错误极有可能是写内存越界
覆盖到其他未知的动态内存控制块了

一旦程序结束去析构此内存时候就出现错误

建议一段一段删除代码进行运行测试,删除某一段之后如果恢复正常了就是问题所在
longshanks 2007-05-23
  • 打赏
  • 举报
回复
C++的GC,09年以后就有了。新标准将会包含可选的、程序员可控的GC。通俗地讲,就是“手自一体”的GC。:)
目前么,只能手动。不过可以通过使用智能指针处理掉这个问题,不会造成性能的下降。
标准中有auto_ptr,tr1及boost有share_ptr和weak_ptr。可以在绝大多数地方替代指针的使用。
MapReduce 2007-05-23
  • 打赏
  • 举报
回复
可以把malloc或new的内存挂到一个链表上,然后free或delete的时候从链表上删除相应的节点,到程序最后结束的时候,把这个链表从头打印一遍,如果malloc,free都配对的话,这个链表应该是个NULL的,否则不为NULL的时候就表示发生了内存泄露
sandrowjw 2007-05-22
  • 打赏
  • 举报
回复
还是手动管理内存吧,C++的确有垃圾收集库,但是那个用起来更难受。
huzhangyou 2007-05-22
  • 打赏
  • 举报
回复
vector<Graphics::TBitmap* > PBitmapVec;

Graphics::TBitmap *Bitmap1 = new Graphics::TBitmap();
Bitmap1->LoadFromFile("C:\\A.bmp");
PBitmapVec.push_back(Bitmap1);
Graphics::TBitmap *Bitmap2 = new Graphics::TBitmap();
Bitmap2->LoadFromFile("C:\\B.bmp");
PBitmapVec.push_back(Bitmap2);
Graphics::TBitmap *Bitmap3 = new Graphics::TBitmap();
Bitmap3->LoadFromFile("C:\\C.bmp");
PBitmapVec.push_back(Bitmap3);
Graphics::TBitmap *Bitmap4 = new Graphics::TBitmap();
Bitmap4->LoadFromFile("C:\\D.bmp");
PBitmapVec.push_back(Bitmap4);

vector<Graphics::TBitmap* >::iterator iter;
for(iter = PBitmapVec.begin() ; iter != PBitmapVec.end() ; ++iter){
delete (*iter);
(*iter) = NULL;
}
thoreau_zzy 2007-05-22
  • 打赏
  • 举报
回复
如果一开始初始化
struct countall
{};

请问那么怎么用delete呢??
多谢指点
谢谢!!
Sco_field 2007-05-22
  • 打赏
  • 举报
回复
那就
for()
{
delete *
  • ;
    }
    heh~
thoreau_zzy 2007-05-22
  • 打赏
  • 举报
回复
我直接用的是动态的数组
std::vector<countall> vecall;
这样申请的内存
不知道怎么delete
直接delete vecall可以嘛?
加载更多回复(7)

64,648

社区成员

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

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