BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #97415同步于 2018/4/15
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

C++中内存泄漏的大坑~摔太惨

loongking
2018/4/15镜像同步35 回复
定义了一个存储对象指针的vector(假设叫a),然后用一个循环new了很多对象,并将对象的指针都放入到vector中。(对象对应的类中还有一个vector<node*>的指针动态数组) 在delete释放内存的时候,①先通过循环释放对象指针指向空间delete a[i] ②然后在删除数组delete []a。 经过这个操作在vs中利用_CrtDumpMemoryLeaks()查看内存泄漏,仍有有内存泄漏。泄漏的断点复查是push_back那个语句。检测手段参考的https://blog.csdn.net/mfcing/article/details/42673393 实在想不出来为啥内存一直有泄漏了,①以为是得重写类的析构函数,重写了析构函数没改善内存泄漏的情况;②以为是push_back浅拷贝的缘故,改用数组之后发现泄漏的情况有稍微改善。③基于②的思路重写了拷贝赋值函数,但是可能我的打开方式不对,泄漏情况仍旧未改善。 贴出代码 请各路的大佬来帮忙看看 附测试代码(含内存泄漏): #include<stdio.h> #include<algorithm> #include<vector> #include<iostream> #define _CRTDBG_MAP_ALLOC #include<stdlib.h> #include<crtdbg.h> using namespace std; class people { public: int schoole; }; class stu { public: int age; int shengao; float Tizhong; vector<people*> peopleListPtr; }; int main() { vector <stu*> wlpointerArray; for (int i = 0; i < 5; i++) { stu * wl = new stu; wl->age = 22 + i; wl->shengao = 172 + i; wl->Tizhong = 55.3 + i; for (int j = 1; j < 2; j++) { people *p = new people; p->schoole = j + 100; wl->peopleListPtr.push_back(p); } wlpointerArray.push_back(wl); } for (int i = 0; i < wlpointerArray.size(); i++) { for (int j = 0; j < wlpointerArray[i]->peopleListPtr.size(); j++) { delete wlpointerArray[i]->peopleListPtr[j]; wlpointerArray[i]->peopleListPtr[j] = NULL; } delete wlpointerArray[i]; wlpointerArray[i] = NULL; } _CrtDumpMemoryLeaks(); return 0; }
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
chenxiansf机器人#1 · 2018/4/15
没毛病
loongking机器人#2 · 2018/4/15
实际运行就提示有内存泄漏 我也很奇怪 【 在 chenxiansf 的大作中提到: 】 : 没毛病
asif12机器人#3 · 2018/4/15
把你的没用的头文件删几个,说不定是cout这些对象占用内存
loongking机器人#4 · 2018/4/15
无可挑剔哈哈哈 【 在 asif12 (长恨安歌) 的大作中提到: 】 : 把你的没用的头文件删几个,说不定是cout这些对象占用内存
NachtZ机器人#5 · 2018/4/16
这个测试代码能内存泄露吗... 我在codeblocks上试了下没毛病的...
a694575177机器人#6 · 2018/4/16
难道不是因为只delete但是没有erase吗 瞎说的。。。
z470967263机器人#7 · 2018/4/16
我觉得是内层循环delete 掉wlpointerArray->peopleListPtr后,内层循环的peopleListPtr.size()也会随着改变 导致有些元素没有被释放[ema3]
torc机器人#8 · 2018/4/16
同意7楼 peopleListPtr.size()变化 估计漏删一半元素
hooyung机器人#9 · 2018/4/16
为什么不从后往前删除?