分析内存分配和释放
#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 Studio2017CommunityVCToolsMSVC14.13.26128crtsrcvcruntime
可以通过查看new_scalar.cpp (new) 和 delete_scalar.cpp(delete)文件.可以先看一下具体源码:
//new VCRuntime的实现
_CRT_SECURITYCRITICAL_ATTRIBUTE
void* __CRTDECL operator new(size_t const size)
{
for (;;)
{
if (void* const block = malloc(size)) //使用malloc分配
{
return block;
}
if (_callnewh(size) == 0)
{
if (size == SIZE_MAX)
{
__scrt_throw_std_bad_array_new_length();
}
else
{
__scrt_throw_std_bad_alloc();
}
}
// The new handler was successful; try to allocate again...
}
}
//delete VCRuntime的实现
_CRT_SECURITYCRITICAL_ATTRIBUTE
void __CRTDECL operator delete(void* const block) noexcept
{
#ifdef _DEBUG
_free_dbg(block, _UNKNOWN_BLOCK);
#else
free(block); //使用free
#endif
}
通过重载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++内存分配与释放顺序
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。