41 C++ new/delete 到底干了啥?

1.new /delete是什么?

关键字/运算符,不是函数

2.new做了两件事:

1.分配内存,通过 operator new()函数实现

2.调用构造函数初始化内存

3.delete 做了两件事

1.调用析构函数

2.释放内存,通过operator delete()函数显示

4.new/delete  和 malloc() /free()的区别

new 、delete 是关键字/运算符。会调用构造函数/析构函数

malloc(),和 free()是函数。从C 语言继承,没有构造函数/析构函数的概念

5.new 出来的内存多大,delete的时候是怎么知道的呢?

例如

int *p = new int();// new 出来的是int大小 - 4个字节,那么delete 的时候,delete怎么知道要销毁4个字节呢?

new 内部有机制,会记住大小,delete的时候会先通过p的地址查找到这块内存,然后根据这个值删除对应大小的空间

6.关于申请和释放数组的问题

对于基础类型的数组

int *parr = new int[3];

delete [] parr;//如果不释放,就会有3*4 = 12个字节的 内存泄漏

对于自定义类型数组

class A{

}

假设A 类中啥都没有,那么这个A 类会占用1个字节的大小

那么意味着:

A * arrclass = new A();

delete arrclass; 如果不释放,会有1个字节被泄露。

但是如果自定义类有析构函数,且new 出来的是数组,那么会额外占用4个字节的大小

class B{

        public:

                ~B(){ };

}

B * arrclassBBB = new B[3]();

//如果没有delete [] arrcassBBB 的情况下,会有7个字节的内存泄漏

每个B 泄漏一个,然后还有一个4字节,这4个字节是记录该数组有几个数字,也就是3.因此泄漏7个字节。

你可能感兴趣的:(c++)