【C++ grammar】nullptr and Dynamic Memory Allocation (空指针和动态内存分配)

空指针

1.1. 0带来的二义性问题

  1. C++03中,空指针使用“0”来表示。0既是一个常量整数,也是一个常量空指针。
  2. C语言中,空指针使用(void *)0来表示
  3. 有时候,用“NULL”来表示空指针(一种可能的实现方式是#define NULL 0)

1.2. C++标准化委员会希望“空指针”是一个确定的东西。
C++11中引入保留字“nullptr”作为空指针
示例:

void codeExample()
{
    
    
    auto x{
    
     10 };           //auto是类型推断机制,通过x初始化的值来推断x类型
    //相当于 int x=10;
    int* p = nullptr;       //定义整型指针变量p,并初始化为空指针nullptr
    int* q{
    
     nullptr };      //定义一个空指针,通过C++11初始化列表的方式赋值
    q = &x;                 //将x的地址赋值给q
}

动态内存管理:分配/释放

2.1. C++中通过运算符new申请动态内存

new  <类型名> (初值) ;     //申请一个变量的空间
new  <类型名>[常量表达式] ;   //申请数组

如果申请成功,返回指定类型内存的地址;
如果申请失败,抛出异常,或者返回空指针(nullptr)。(C++11)

2.2. 动态内存使用完毕后,要用delete运算符来释放。

delete   <指针名>;    //删除一个变量/对象
delete []  <指针名>;     //删除数组空间

在这里插入图片描述

int main()
{
    
    
    int* p = nullptr;       //定义整型指针变量p,并初始化为空指针nullptr
    int* q{
    
     nullptr };      //定义一个空指针,通过C++11初始化列表的方式赋值
    p = new int(42);
    q = new int[4];
    cout << "Before change, p =" << *p << endl;
    *p = 24;
    cout << "After change, p =" << *p << endl;
    for (int i = 0;i < 4;i++)
    {
    
    
        *(q + i) = 10 + i;
        cout << *(q + i) << endl;
    }
    delete p;
    delete [] q;
    return 0;
}

在这里插入图片描述
在C++11中,还能使用0来代表空指针吗?
答案:可以,因为需要向下兼容:
例如这样:

int* p = 0;       
int* q{
    
     0 };     

new/delete 与 malloc/free 的区别是什么?

1、malloc与free是C++/C的标准库函数,new/delete是C++的运算符,它们都可用于申请动态内存和释放内存。

2、对于非内部数据类型的对象而言,只用malloc/free无法满足动态对象的要求。对象在创建的同时,要自动执行构造函数,对象在消亡之前要自动执行析构函数。而由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free
总结:malloc/free是C/C++语言的标准库函数,new/delete是C++的运算符 2.new能够自动分配空间大小 3.对于用户自定义的对象而言,用maloc/free无法满足动态管理对象的要求。
3、malloc开辟空间的大小需自己计算,new是编译器计算。

4、malloc返回指针是void,需要强制转换为对应类型的指针。new直接返回对应类型指针。

5、new/delete与malloc/free申请内存位置说明,malloc我们知道它是在堆上分配内存的,但new其实不能说是在堆上,C++中,对new申请内存位置有一个抽象概念,它为自由存储区,它可以在堆上,也可以在静态存储区上分配,这主要取决于operator
new实现细节,取决与它在哪里为对象分配空间。

猜你喜欢

转载自blog.csdn.net/qq_42604176/article/details/108895639