C++语言没有C#那样的垃圾回收机制,即需要开发人员自己去管理内存,包括申请和释放内存。如果内存使用不当,就容易造成内存泄漏(memory leak)或者内存崩溃(memory crash)。
内存泄漏(memory leak)是指程序中己动态申请的堆内存由于某种原因程序没有进行释放,导致程序运行速度减慢甚至系统崩溃等严重后果。
class Obj {
public:
Obj() {
buffer_ = new char;
}
~Obj(){}
private:
char *buffer_;
};
析构函数中要手动释放申请的内存
~Obj(){
delete buffer;
}
class Obj {
public:
Obj) {
buffer_ = new char;
}
~Obj(){
delete buffer;
}
private:
char *buffer_;
};
Obj *t = new Obj;
free(t);
通过free函数释放了内存,但是没有触发Test的析构函数以释放Test的成员变量,从而引起内存泄漏
int main()
{
int *t = new int[10];
delete t;
return 0;
}
delete[] t;
申请了一组内存,但是只释放了首块
class Obj {
public:
Obj() {
buffer_ = new char;
}
~Obj() {
delete buffer_;
}
private:
char* buffer_;
};
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
{
Obj ob;
}
return a.exec();
}
如果对象可以在栈上进行分配,就在栈上进行分配,一方面栈的效率远高于堆,另一方面内存的申请和释放由编译器自动完成。
手动释放
对于malloc函数分配的内存,使用free函数进行释放
对于new操作符分配的内存,使用delete操作符来进行释放
对于new[]创建的对象,使用delete[]来进行释放
使用智能指针:推荐
class Obj {
public:
Obj() {
buffer_ = new char;
}
~Obj() {
delete buffer_;
}
public:
void func() {
// TODO:
}
private:
char* buffer_;
};
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
{
auto p1 = std::make_unique<Obj>();
p1->func();
}
return a.exec();
}
定义:所谓智能指针就是采用RAII(资源获取既初始化)机制对普通指针进行的一层封装,自动帮你释放内存。
内存越界
比如写一块内存区域的时候没有控制好长度,把其他数据值给破坏了
内存重复释放
一块内存区域已经被释放,但是因为逻辑问题,再次尝试释放该内存
int* pTest = new int(100);
delete pTest;
//pTest = nullptr;
delete pTest;
C/C++ 内存泄漏-原因、避免以及定位
https://mp.weixin.qq.com/s/3ZIUxS1QtCT5olCYZzw4Qg
C++ 内存崩溃问题应该如何调试?
https://zhuanlan.zhihu.com/p/548793246?utm_medium=social&utm_oi=805143448788303872&utm_psn=1594435166818185216&utm_source=wechat_session
Modern C++ 智能指针详解
https://mp.weixin.qq.com/s?__biz=MzU2MTkwMTE4Nw==&mid=2247496204&idx=1&sn=ef65b47aa971696ada103a638cbcc553&chksm=fc7309e0cb0480f62f7b09be4c4d892fe9a62c1eb594174e08d2f3947ca1cd34f31790110399&scene=21#wechat_redirect
使用umdh.exe 内存泄露分析
https://blog.csdn.net/asiwxy/article/details/124428309