c++分析内存分配和释放
分析内存分配和释放
#include <iostream>
using namespace std;
//c++ 内存分配与释放本质
//通过反汇编得知
//new本质上是一个函数,最终通过malloc进行分配内存
//delete也是一个函数,最终通过free进行释放内存
int main(int argc, char *argv[])
{
int *p1 = new int(5);
int *p2 = new int[10]{ 0, 1,2,3,4,5,6,7,8,9 };
delete p1;
delete[] p2;
cin.get();
return 0;
}
通过反汇编,最终看到new函数

由于我使用的是Visual Studio 2017 社区版,vcruntime文件路径可能不太一样.
具体路径如下:
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.13.26128\crt\src\vcruntime
可以通过查看new_scalar.cpp (new) 和 delete_scalar.cpp(delete)文件.
通过重载new/delete,查看内存分配和释放顺序
#include <iostream>
using namespace std;
class Person
{
public:
Person()
{
cout << "构造函数" << endl;
}
~Person()
{
cout << "析构函数" << endl;
}
static void* operator new (size_t size)
{
cout << "局部 new " << endl;
Person *p = ::new Person; //引用全局的new,这里还是会调用一次构造函数
return p;
}
static void operator delete(void* p)
{
cout << "局部 delete " << endl;
::delete p;
}
};
////全局重载new和delete
void* operator new(size_t size)
{
cout << "全局重载 new调用" << endl;
void* p = malloc(size);
return p;
}
void* operator new[](size_t size)
{
cout << "全局重载 new[]调用" << endl;
return operator new (size);
}
void operator delete(void* p)
{
cout << "全局重载 delete调用" << endl;
free(p);
}
void operator delete[](void* p)
{
cout << "全局重载 delete[]调用" << endl;
free(p);
}
//局部重载new和delete,实现单例模式,避免反复在堆上分配和多次释放异常
//内存分配与释放顺序,可以对比下图
//new->::new->malloc->构造函数
//析构函数->delete->::delete->free
//new 无论是局部还是全局重载,都会调用构造函数
int main(int argc, char *argv[])
{
Person *p1 = new Person;
delete p1;
cin.get();
return 0;
}
执行结果
秋风
2018-03-14