欢迎来到小居数码网-一家分享数码知识,生活小常识的网站,希望可以帮助到您。

当前位置:生活小常识 > 数码知识 >
优质

c++内存释放原则(c语言内存分配与释放)

数码知识

孙宇优秀作者

原创内容 来源:小居数码网 时间:2024-07-28 18:47:01 阅读() 收藏:41 分享:59

导读:您正在阅读的是关于【数码知识】的问题,本文由科普作家协会,生活小能手,著名生活达人等整理监督编写。本文有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函数

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 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}

通过重载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和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%的朋友还想知道的:

(502)个朋友认为回复得到帮助。

部分文章信息来源于以及网友投稿,转载请说明出处。

本文标题:c++内存释放原则(c语言内存分配与释放):http://sjzlt.cn/shuma/152398.html

猜你喜欢