C++动态内存分配

C++动态内存分配

一、C语言中动态内存如何分配?

在C中,可以调用malloc/calloc/realloc函数向系统申请一块存储空间,使用结束用free函数释放空间,因为申请的空间均在堆上申请,需要手动释放,否则会出现内存泄漏。至于C中这些函数如何使用在此不多加赘述,请参见C中动态内存分配。

二、C++中的动态内存分配

C++中提供两种运算符new和delete,使用它们更方便实现内存空间的动态分配。若要为数组动态分配空间则用new[ ]和delete[ ]。其使用方法如下:
数据类型 * 指针变量=new 数据类型(说明需求空间大小的一个整数)
delete 指针变量
注:数据类型可以是任何数据类型,包括用户自定义类型 。
这是一个new和delete使用的例子

三、那么malloc/free和new/delete有什么区别和联系?

#include<cstdio>
#include<cstdlib>
#include<iostream>
using namespace std;
class A
{
public:
    A(int a = 10)
        :_a(a)
    {
        cout << "A(int a = 10)" << endl;
    }
    ~A()
    {
        cout << "~A()" << endl;
    }
private:
    int _a;

};
int main()
{
    A *a1=new A;
    delete a1;
    system("pause");
    return 0;
} 

此程序中,new调用了构造函数,给a赋值。delete调用析构函数。

new完成了给a赋值

#include<cstdio>
#include<cstdlib>
#include<iostream>
using namespace std;
class A
{
public:
    A(int a = 10)
        :_a(a)
    {
        cout << "A(int a = 10)" << endl;
    }
    ~A()
    {
        cout << "~A()" << endl;
    }
private:
    int _a;

};
int main()
{
    A*a1=(A*)malloc(sizeof(A));
    free(a1);
    system("pause");
    return 0;
} 

这段代码中用了malloc 和free来动态分配空间。只是开辟和回收空间,并没有调用构造/析构函数。并且没有给a赋值。

【malloc/free和new/delete的区别和联系?】

  1. 它们都是动态管理内存的⼊口。
  2. malloc/free是C/C++标准库的函数,new/delete是C++操作符。
  3. malloc/free只是动态分配内存空间/释放空间。⽽new/delete除了分配空间还会调⽤构造函数和析构函数进⾏初始化与清理(清理成员)。
  4. malloc/free需要⼿动计算类型⼤⼩且返回值会void*,new/delete可⾃⼰计算类型的⼤⼩,返回对应类型的指针。
    5、malloc/free申请空间后得判空,而new/delete不用。
    6、new/delete底层调用malloc/free。

四、标准库函数operator new和operator delete

C++的其他内存管理接口
void * operator new (size_t size); 其底层由malloc函数实现
void operator delete (void* p); 其底层由free_dbg函数实现
void * operator new [](size_t size); ——>operator new()——>malloc()
void operator delete[] (void* p); ——>operator delete()——>free_dbg()

operator new底层的原理

五、定位new表达式

定位new表达式是在已分配的原始内存空间中调⽤构造函数初始化⼀个对象。
new (place_address) type
new (place_address) type(initializer-list)
place_address必须是⼀个指针,initializer-list是类型的初始化列表。

class A
{
public:
    A(int a = 10)
        :_a(a)
    {
        cout << "A(int a = 10)" << endl;
    }
    ~A()
    {
        cout << "~A()" << endl;
    }
private:
    int _a;

};
int main()
{
    A*pa = (A*)malloc(10 * sizeof(A));
    int i = 0;
    for (i = 0; i < 10;i++)
    {
        new(pa + i)A(i);
    }
    for (i = 0; i < 10; i++)
    {
        pa[i].~A();
    }
    free(pa);
    system("pause");
    return 0;
}

new(pa + i)A(i)此句用在在for循环中不断调用构造函数,来初始化对象。

总结:在C++中动态内存分配,new和delete操作符的使用可以方便内存管理,在开辟和释放空间的功能基础上自带调用构造函数和析构函数功能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值