[008]new、delete及动态内存分配

时间:2023-12-17 13:50:44

1、new和delete都会用,这里只声明一点:

C++ 没有明确定义如何释放指向不是用 new 分配的内存地址的指针。

比如下面的代码:

 #include<iostream>

 using namespace std;

 int main() {
int i = ;
int *p0 = &i;
int *p1 = new int();
int *p2 = ; delete p0; // Compile OK, Run Error
delete p1; // Compile OK, Run OK
delete p2; // Compile OK, Run OK, No meaning return ;
}

对于p0,编译器无法断定其是一个指向什么类型的指针,因此尽管这个语句是错误的,但是大部分编译器都能编译通过,运行时会出错。

对于p1,指向初始化后的0值,对其作delete操作是可合法的

对于p2,指针的值为0,对其作delete操作是可合法的,但是没有意义,因为C++保证:删除0值的指针是安全的。

2、对于动态内存分配,如果和容器结合起来,需要注意的是:如果指针指向动态分配生成的指针,那么delete这个指针也是不可以的

 #include<iostream>
#include<vector>
#include<string> using namespace std; int main() {
vector<string> svec(, "hello World");
vector<string> *pvec1 = new vector<string>();
vector<string> *pv1 = &svec;
vector<string> *pv2 = pvec1; cout << svec[] << endl;
cout << (*pvec1)[] << endl; // 要特别注意*pvec1的括号
cout << (*pv1)[] << endl;
cout << (*pv2)[] << endl; delete pvec1;
delete pv1; // Compile OK, Run Error
delete pv2; // Compile OK, Run Error
}