下面的代码中,哪个语句是错的
#include<iostream>
#include<string>
#include<vector>
#include<bitset>
using std::string;
using std::vector;
using std::cin;
using std::cout;
using std::endl;
using std::bitset;
int main()
{
vector<string> svec(10); // (1)
vector<string> *pvec1 = new vector<string>(10); // (2)
vector<string> **pvec2 = new vector<string>[10]; // (3)
vector<string> *pv1 = &svec; // (4)
vector<string> *pv2 = pvec1; // (5)
delete svec; // (6)
delete pvec1; // (7)
delete [] pvec2; // (8)
delete pv1; // (9)
delete pv2; // (10)
return 0;
}
(3) 错
这是一个标准的动态数组,不应该用二维指针.
直接 vector<string> *pvec2 = new vector<string>[10]; 就OK了.
(6) 错
svec 不是指针,不能 delete .
(8)
似乎如果是二维指针,像删除动态数组一样, delete [] ,
无论从编译上说,还是从内存上说,应该是没有错误的吧..
(9) 错
pv1 指针所指向的 内存地址,是 svec,而不是从 Heap 上 new 出来的.
所以 不能够 delete.
这样做运行时会 Crash.
(10) 错
pvec1 和 pv2 所在和ixiangde内存地址相同,
这段内存地址在 delete pvec1 的时候,已经被 delete 一次了.
两个指针同时指向一段内存的时候,第2次delete 就会 运行时 Crash.
总结需要注意的几点:
1.
只有 new 来开辟 Heap 内存的 pointer ,才可以 delete.
比如 上面的 (9)有错误.
2.
同一块内存,不能多次被 delete.
比如两个指针指向同一块内存,容易发生这种情况.
比如上面的 (10) 是错误的.
3.
像我以前 http://blog.csdn.net/korekara88730/article/details/7422773 这里对delete的猜想一样.
const int *pi = new int(123);
这样的 pi 指针,虽然是 指向常量的指针,不能够通过 pi 来修改 内存 的值.
但是是可以通过 pi 来销毁 value 这段内存的.
比如
const int *pi = new int(123);
*pi = 333; // wrong
delete pi; // okay