mallloc/free和new/delete

来源:互联网 发布:wordpress分类目录seo 编辑:程序博客网 时间:2024/06/06 09:29

        首先我们来回顾一下在C语言中有哪些可以用于动态内存开辟的函数:

注意:这三个函数都是在堆上开辟的内存,需要用户自己来管理,所以一定要和free()函数配对使用,否则会造成内存泄漏。

动态内存开辟常见错误:

1、对NULL指针进行解引用操作(tip:开辟完先检查是否开辟成功再使用)

2、对分配的内存进行操作时越界(tip:开辟内存时,开辟足够的空间)

3、释放非动态开辟的内存(tip:开辟时用哪个指针接收的就free掉哪个指针)

4、忘记释放(tip:写开辟内存函数和free()函数配对使用)

5、释放一块动态分配的内存的一部分(tip:操作时用一个临时的指针代替内存的地址,避免改变接收内存时的指针的指向)

6、一块动态内存被释放后被继续使用(tip:将一块空间释放掉后,将指向这块空间的指针赋成NULL)


现在来看一下new/delete的用法:

在C++ 中一般通过new和delete运算符进行动态内存管理。new用于开辟内存,delete用于释放内存。

new的作用是:1、调用operator new 分配空间   2、调用构造函数初始化对象

delete的作用:1、调用析构函数清理对象  2、调用 operator new释放对象

new[ ]的作用:1、调用operator new分配空间   2、调用N次析构函数分别初始化每个对象

delete[ ]的作用:1、调用N次析构函数清理对象  2、调用operator delete 释放空间


举个例子:

#include <iostream>using namespace std;class Array{public:Array(size_t size = 10)//构造函数:_size(size)//_size被初始化为10, _a(0){cout << "Array(size_t size)" << endl;if (_size > 0)//{_a = new int[size];//开辟10个整型大小的内存}}~Array()//析构函数{cout << "~Array()" << endl;if (_a){delete[] _a;_a = 0;_size = 0;}}private:int *_a;size_t _size;};void Test(){Array* p1 = (Array*)malloc(sizeof (Array));Array* p2 = new Array;//调用一次构造函数Array* p3 = new Array[10];//调用10次构造函数free(p1);delete p2;//调用一次析构函数delete[] p3;//调用十次析构函数}int main(){Test();return 0;}

运行结果为:

正好是分别调用了11次构造函数和析构函数

注意:对于new type [ ]  只有显示定义析构函数的时候会多开辟4个字节来存储对象个数


定位new表达式:

定位new表达式是在已分配的原始内存空间中调用构造函数初始化一个对象。

使用格式有两种:

1、new  (place_address) type

2、new  (place_address) type (初始化列表)


malloc/free和new/delete的异同:

共同点:都是从对堆上来开辟空间,用户需要自己管理。

不同点:


原创粉丝点击