一些常见的内存泄漏的总结,欢迎补充

xuhb95083023 2009-04-21 06:13:19
首先 boundscheck 是一个不错的内存泄漏检测工具,出现内存泄漏可以通过这个工具来排查,以下是一些常见的或者不常遇到的内存泄漏的情形,代码中可以通过shared_ptr、scoped_ptr、shared_array、scoped_array.hpp来尽可能减少出错机会

1、最常见的 malloc 没有对应的 free , new 没有对应的 delete, new [] 没有对应的 delete []

2、自定义了operator new 没有对应的自定义的 operator delete

3、基类析构函数为非虚,会引发unknown behavior或者内存泄漏,特别是基类有指针成员的时候

4、在析构函数中调用了虚函数可能会引起内存泄漏

5、对指针容器使用标准库一些算法比如remove的时候会引发内存泄漏,其实这点就是第一条中的情形引起的
...全文
201 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
xuhb95083023 2009-04-26
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 taodm 的回复:]
请举个4)的例子吧。
[/Quote]
前面的发错了



#include <iostream>

using namespace std;

class widget {};

class father {
public:
father() {
cout << "父类构造,w1被构造" << endl;
w1 = new widget;
};
virtual ~father() {
cout << "父类析构" << endl;
}

virtual void before_destructor() {
cout << "父类析构前准备动作,w1被析构" << endl;
delete w1;
}
private:
widget* w1;
};

class son: public father {
public:
son() {
cout << "子类构造,w2被构造" << endl;
w2 = new widget;
}
virtual ~son() {
cout << "子类析构" << endl;
before_destructor();
}

virtual void before_destructor() {
cout << "子类析构前准备动作,w2被析构" << endl;
delete w2;
}

private:
widget* w2;
};

int main() {

father* f = new son;

delete f;

::system("PAUSE");

return 0;
}


xuhb95083023 2009-04-26
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 taodm 的回复:]
请举个4)的例子吧。
[/Quote]



class widget {};

class father {
public:
father() {};
virtual ~father() {}

virtual before_destructor() {
cout << "析构前准备动作" << endl;
}
private:
}

class son: public father {
public:
son() { w = new widget; }
virtual ~son() { before_destructor(); }

virtual before_destructor() {
cout << "开始析构" << endl;
delete w;
}

private:
widget* w;

}

lovehmj 2009-04-24
  • 打赏
  • 举报
回复
有启示!!!
pope_key 2009-04-24
  • 打赏
  • 举报
回复
如果对string进行了memset会有许多虚函数会失效,最好用struct 的构造对成员变量进行初始化
NirvanaVirus 2009-04-24
  • 打赏
  • 举报
回复
谢谢楼主,学习ing...
yashuwa0622 2009-04-24
  • 打赏
  • 举报
回复
3 楼的那个代码有问题吧。。没看明白
shuaiwang_01 2009-04-24
  • 打赏
  • 举报
回复
学习了!
taodm 2009-04-24
  • 打赏
  • 举报
回复
请举个4)的例子吧。
scsnsjsl_cs_dn 2009-04-24
  • 打赏
  • 举报
回复
收藏
lori227 2009-04-21
  • 打赏
  • 举报
回复

struct My_Struct
{
string strValue;

......
};

int i = 100;
while(i)
{
--i;
My_Struct mystruct;
memset(&mystruct, 0, sizeof(mystruct));
strValue = "some string";
.......
}




这样也会....
「已注销」 2009-04-21
  • 打赏
  • 举报
回复
老问题了,网上很多资料的
xxuin021737 2009-04-21
  • 打赏
  • 举报
回复
学习中!!!!!

65,210

社区成员

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

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