如果a有一个指向对象的指针数组,那么填充数组的方式更清晰,(1)或(2),在下面的代码段中?是
string ** list = new string*[5];
string* s = new string("foo");
*list[0] = *s; //(1)
list[0] = s; //(2)
答案 0 :(得分:3)
第一种方法会导致未定义的行为。 list[0]
未指向有效的string
对象,因此取消引用它并分配给它将会很糟糕。
第二种方法对我来说没问题(从某种意义上说它不会有未定义的行为),但我想这取决于你如何继续使用它。
答案 1 :(得分:0)
很难说没有看到你的其他程序,但这两个似乎错了。如果您正在寻找“干净”,请尝试以下任一方法:
string * list = new string[5];
list[0] = "foo";
或
vector<string> list(5);
list[0] = "foo";
这两者都(主观地)比你的任何一个更干净。
答案 2 :(得分:0)
(1)是一个错误,因为list [0]最初是NULL,所以你有效地写了
*NULL = *s;
你应该写
list[0] = new string;
*list[0] = *s;
或只是
list[0] = new string(*s);
(2)不是错误,但只要* s存在,*(list [0])就会存在。如果更改* s,则*(list [0])也会更改。您还应删除s或list [0],但不能同时删除两者。除非你真的需要这种行为,否则(2)是丑陋的。
一般来说,我不明白你为什么需要指针。因此,
string* list = new string[5];
会更清洁,
vector<string> list(5);
会更好。
最后,调用“list”不是一个好主意,因为这个名称有一个标准容器。 (既不会调用任何“矢量”,“设置”,“字符串”,“堆栈”或“地图”)。