孙宇优秀作者
原创内容 来源:小居数码网 时间:2024-07-28 18:47:01 阅读() 收藏:33 分享:52 爆
导读:您正在阅读的是关于【数码知识】的问题,本文由科普作家协会,生活小能手,著名生活达人等整理监督编写。本文有952个文字,大小约为4KB,预计阅读时间3分钟。
分析内存分配和释放#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函数
#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和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_ATTRIBUTEvoid* __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_ATTRIBUTEvoid __CRTDECL operator delete(void* const block) noexcept{ #ifdef _DEBUG _free_dbg(block, _UNKNOWN_BLOCK); #else free(block); //使用free #endif}
#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和deletevoid* 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++内存分配与释放顺序
上面就是小居数码小编今天给大家介绍的关于(c语言内存分配与释放)的全部内容,希望可以帮助到你,想了解更多关于数码知识的问题,欢迎关注我们,并收藏,转发,分享。
94%的朋友还想知道的:
(528)个朋友认为回复得到帮助。
部分文章信息来源于以及网友投稿,转载请说明出处。
本文标题:c++内存释放原则(c语言内存分配与释放):http://sjzlt.cn/shuma/152398.html