new 和 delete

在C语言中,申请回收堆内存使用的是malloc和free。见代码

#include<iostream>
using namespace std;
#define SIZE 10

int main(int argc, char *argv[])
{
    int *p_int = (int *)malloc(sizeof(int)*SIZE);
    if (NULL == p_int)
        exit(1);
    for (int i = 0; i < SIZE; i++)
    {
        p_int[i] = i;
    }

    free(p_int);
    return 0;
}
View Code

C++针对申请回收堆内存引入了新的方法,即new和delete,见代码

#include<iostream>
using namespace std;
#define SIZE 10

int main(int argc, char *argv[])
{
    int *p_int = new int[SIZE];
    for (int i = 0; i < SIZE; ++i)
        p_int[i] = i;
    delete[]p_int;
    return 0;
}
View Code

C 和 C++差异点

①C++开辟堆内存不需要像C一样强制类型转换

②一般new开辟的空间不需要使用if(NULL==p)判空,而是和异常机制相结合

③C++允许在申请空间的时候同时初始化,C必须先申请再初始化。

#include<iostream>
using namespace std;

int main(int argc, char *argv[])
{
    int *p_int = (int *)malloc(sizeof(int));
    *p_int = 10;
    free(p_int);

    int *q_int = new int(10);
    delete q_int;

    return 0;
}
View Code

④对于普通变量的开辟释放内存差异不是很大。但是对于类而言,malloc仅仅只是申请内存。而new在申请内存的时候调用了构造函数,还可以初始化。delete的时候调用析构函数再释放空间

delete[]的方括号中不需要填数组元素数,系统自知。即使写了,编译器也忽略。

C++,由堆区创建对象数组,只能调用缺省的构造函数,不能调用其他任何构造函数。如果没有缺省的构造函数,则不能创建对象数组。


new三种形式

扫描二维码关注公众号,回复: 2863250 查看本文章

new operator、operator new、placement new

分割线上面就是new operator,这是我们最常见的new使用方式。实际上new operator分成了2步

①调用operator new开辟空间,而开辟空间还是调用的malloc。这一块跟代码跟不出来,我找到了对应的汇编形似

operator new:
00409280 push ebp
00409281 mov ebp,esp
00409283 push ecx
00409284 push1
00409286 mov eax,dword ptr [cb]
00409289 push eax
0040928A cal1 _nh malloc(00409c30)
0040928F add esp,8
00409292 mov dword ptr [res],eax
00409295 mov eax,dword ptr [res]
00409298 mov esp,ebp
0040929A pop ebp
0040929B ret
View Code

②调用相应构造函数构造对象

一旦使用new operator,①②都要开始做,缺一不可。但是我们可以通过重载operator new影响operator new开辟空间的过程。

 

 

 

猜你喜欢

转载自www.cnblogs.com/kelamoyujuzhen/p/9502940.html