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函数

通过反汇编的方式,看到new和delete都是函数,分别使用malloc分配内存和free释放内存

由于我使用的是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;
}

执行结果

c++内存分配与释放顺序

秋风 2018-03-14