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

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

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

比如下面的代码:

 1 #include<iostream>
 2 
 3 using namespace std;
 4 
 5 int main() {
 6     int i = 1;
 7     int *p0 = &i;
 8     int *p1 = new int();
 9     int *p2 = 0;
10 
11     delete p0;    // Compile OK, Run Error
12     delete p1;    // Compile OK, Run OK
13     delete p2;    // Compile OK, Run OK, No meaning
14 
15     return 0;
16 }

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

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

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

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

 1 #include<iostream>
 2 #include<vector>
 3 #include<string>
 4 
 5 using namespace std;
 6 
 7 int main() {
 8     vector<string> svec(10, "hello World");  
 9     vector<string> *pvec1 = new vector<string>(10);   
10     vector<string> *pv1 = &svec;  
11     vector<string> *pv2 = pvec1;  
12              
13     cout << svec[0] << endl;
14     cout << (*pvec1)[0] << endl;   // 要特别注意*pvec1的括号
15     cout << (*pv1)[0] << endl;
16     cout << (*pv2)[0] << endl;
17 
18     delete pvec1;
19     delete pv1;                    // Compile OK, Run Error
20     delete pv2;                    // Compile OK, Run Error
21 }
原文地址:https://www.cnblogs.com/hustcser/p/3638125.html