C++动态内存管理好难怎么办?零基础图文讲解,小白轻松理解原理

栏目: C++ · 发布时间: 4年前

内容简介:首先我们先了解一下内存:C语言使用malloc/free动态管理内存空间,C++引入了new/delete,new[]/delete[]来动态管理内存。

首先我们先了解一下内存:

C++动态内存管理好难怎么办?零基础图文讲解,小白轻松理解原理

C语言使用malloc/free动态管理内存空间,C++引入了new/delete,new[]/delete[]来动态管理内存。

介绍new/delete,new[]/delete[]之前我们先了解一下operator new,operator delete,operator new[],operator delete[]函数。

注:这些函数并没有重载new/delete表达式。

最后,如果大家如果在自学遇到困难,想找一个C++的学习环境,可以加入我们的C++学习圈, 点击我加入吧 ,会节约很多时间,减少很多在学习中遇到的难题。

C++动态内存管理好难怎么办?零基础图文讲解,小白轻松理解原理

函数声明如下:

void* operator new(size_t size);

void operator delete(size_t size);

void* operator new[](size_t size);

void operator delete[](size_t size);

析:operator new/operator delete,operator new[]/operator delete[]是标准库函数,用法和malloc/free的用法一样,只负责分配/释放空间,但实际上operator new/operator delete只是malloc/free的一层封装。

new/delete:动态管理对象;

new[]/delete[]动态管理对象数组。

int* ptr1=new int;//动态分配4个字节的空间

delete ptr;

int* ptr2=new int(4);//动态内存分配4个字节空间并初始化

delete ptr2;

int* ptr3=new int[4];//动态内存分配16个字节空间

delete[];

1>,new/delete实际上做了什么事呢??

new:先调用operator new分配空间,再调用构造函数初始化空间。

delete:先调用析构函数清理对象,再调用operator delete释放空间。

C++动态内存管理好难怎么办?零基础图文讲解,小白轻松理解原理 C++动态内存管理好难怎么办?零基础图文讲解,小白轻松理解原理

2>,new[]/delete[]实际上做了什么事呢??

new[n]:调用operator new分配空间,再调用n次构造函数初始化对象。

delete[n]:调用n次析构函数清理对象,再调用operator delete释放空间。

C++动态内存管理好难怎么办?零基础图文讲解,小白轻松理解原理

为什么编译器会知道调用多少次构造函数,析构函数呢?

原来在new[ ]分配空间的时候会在头部多分配4个字节来存n,这样在调用new[]/delete[]时就知道调用几次构造函数和析构函数了。

new/delete,new[]/delete[]为什么要成对出现?

当new在开辟内置类型的空间时,不成对出现是可以的;但是当开辟非内置类型空间时,就要多开辟4个字节,这时如果不成对使用就会造成内存泄漏或者程序崩溃。

C++动态内存管理好难怎么办?零基础图文讲解,小白轻松理解原理

用宏模拟实现new[]/delete[]申请和释放数组

//DELETE_ARRAY参数中传n

define NEW_ARRAY(ptr,type,n)

do{

ptr=(type )operatornew(sizeof(type) n);

for (size_t i = 0; i

{

new(ptr+i)type;

}

} while (0);

define DELETE_ARRAY(ptr,type,n)

do{

for (size_t i = 0; i < n; ++i)

{

(ptr+i)->~String();

}

operator delete ptr;

} while (0);

C++动态内存管理好难怎么办?零基础图文讲解,小白轻松理解原理

//给DELETE_ARRAY中不传n

define NEW_ARRAY(ptr,type,n)

do{

ptr = (type )operator new(sizeof(type) n + 4); //给n也分配空间

(int )ptr = n;

ptr=(type )((char )ptr+4);

for (size_t i = 0; i < n; ++i)

{

new(ptr + i)(type);

}

} while (0);

define DELETE_ARRAY(ptr,type)

do{

size_t n = ((int )ptr - 1);

for (size_t i = 0; i < n; ++i)

{

(ptr + i)->~String();

}

operator delete(char*(ptr - 4));

} while (0);

malloc/free和new/delete之间关系和差异

C++动态内存管理好难怎么办?零基础图文讲解,小白轻松理解原理

关系:都能进行动态内存管理。

差异:1>,malloc/free是标准的库函数, new/delete是操作符;

2>,malloc/free只是分配/释放内存 ,new/delete不仅分配/释放内存还调用构造函数初始化和析构函数清理;

3>,malloc/free手动计算类型大小,返回值void*,new/delete自动计算类型大小,返回对应类型的指针;

4>,malloc/free失败返回0, new/delete失败抛异常。


以上所述就是小编给大家介绍的《C++动态内存管理好难怎么办?零基础图文讲解,小白轻松理解原理》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

成为乔布斯

成为乔布斯

[美] 布伦特·施兰德、[美] 里克·特策利 / 陶亮 / 中信出版集团 / 2016-10 / 69.00元

本书描绘了一位多姿多彩的人物将与生俱来的激情与成熟的管理方式相结合,打造出史上最有价值、最受消费者追捧的公司,这本书将彻底改变我们看待乔布斯的方式。 本书推翻了关于史蒂夫·乔布斯的传说和陈词滥调,比如他是天才和混蛋的结合体,暴躁易怒、自私自利,怠慢朋友与家人。本书揭示了这位苹果联合创始人和CEO的家庭生活与职业生涯,并回答了一个关键问题:为什么如此轻狂傲慢、以至于被赶出苹果的年轻人能成为史上......一起来看看 《成为乔布斯》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

在线进制转换器
在线进制转换器

各进制数互转换器

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具