空指针
1.1. 0带来的二义性问题
- C++03中,空指针使用“0”来表示。0既是一个常量整数,也是一个常量空指针。
- C语言中,空指针使用(void *)0来表示
- 有时候,用“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,并初始化为空指针nullptrint* 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,并初始化为空指针nullptrint* 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实现细节,取决与它在哪里为对象分配空间。