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

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

内容简介:首先我们先了解一下内存: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++动态内存管理好难怎么办?零基础图文讲解,小白轻松理解原理》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

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

Programming Collective Intelligence

Programming Collective Intelligence

Toby Segaran / O'Reilly Media / 2007-8-26 / USD 39.99

Want to tap the power behind search rankings, product recommendations, social bookmarking, and online matchmaking? This fascinating book demonstrates how you can build Web 2.0 applications to mine the......一起来看看 《Programming Collective Intelligence》 这本书的介绍吧!

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具