C++,new,delete,c++primer上的题目

来源:百度知道 编辑:UC知道 时间:2024/05/09 06:28:33
下列语句哪些是非法的或错误的
(a) vector<string> svec( 10 );
(b) vector<string> *pvec1 = new vector<string>(10);
(c) vector<string> **pvec2 = new vector<string>[10];
(d) vector<string> *pv1 = &svec;
(e) vector<string> *pv2 = pvec1;
(f) delete svec;
(g) delete pvec1;
(h) delete [] pvec2;
(i) delete pv1;
(j) delete pv2;
我觉得:
(a)正确
(b) yes
(c)yes
(d)yes
(e)yes
(f) wrong
(g)yes
(h)???yes or wrong
(i)????这个只是指针,没有分配空间,和svec共用同一段对象内存,是不是不用delete呀
(j)同上

(a)~(g)跟你意见一致。
(h) yes; 不加[]的话就是致命错误了。
(i) wrong; svec是编译器自动在栈上分配的空间,并不是在堆上new出来的.
(j) yes; pv2与pvec1指向同一段开辟的内容空间,这样操作是可以的。但需注意pvec1所指空间已被释放,变成悬空指针,较好的做法是将其置为0,表示已经失效。

太犀利了。出了a其他情况我都没用过。

一般直接用iterater了。

a)yes

b)yes

c)wrong
//因为new vector<string>[10]返回一个vetcor<string>*,目标类型不匹配

d)yes

e)wrong
//前面的编译错误导致这里错误,而且类型不匹配

f)wrong
//参数不是指针

g)yes

h)wrong
//前面的编译错误导致此处不能运行,结果未知
//但是这句是符合语法的

i)wrong
//符合语法,但是在删除一个栈上的对象。

j)wrong
//同i

我觉得:
(a)正确
(b) yes
(c)wrong c的赋值符号左右类型不等所以错误
(d)yes
(e)yes
(f) wrong
f svec不是指针不能用于delete命令
(g)yes
(h)这句是符合语法的。但由于上面c语句不成功所以不能正常运行
(i) wrong svec是编译器自动在栈上分配的空间,并不是在堆上new出来的.
(j)wrong 我认为j也是错误的。因为经过vector<string>
*pv2 = pvec1后,pv2和pvec1指向通一个动态创建的对象(见b语句)。而同一个对象是不能delete两次(第一次是g,第二次即j)的。