[C++ 学习] C++ Primer 习题 5.30 new & delete 操作符

下面的代码中,哪个语句是错的

#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


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值