为指针赋值

assigning values to pointers

本文关键字:赋值 指针      更新时间:2023-10-16

如果一个有一个指向对象的指针数组,那么在下面的代码段中,哪种填充数组的方式更干净,(1)或(2)?是

string ** list = new string*[5];
string* s = new string("foo");
*list[0] = *s;  //(1)
list[0] = s;   //(2)

第一种方法将导致未定义的行为。 list[0] 不指向有效的 string 对象,因此取消引用它并分配给它将是不好的。

第二种方法对我来说看起来不错(从某种意义上说,它不会有未定义的行为),但我想这取决于你如何继续使用它。

很难说没有看到程序的其余部分,但这两种情况似乎都是错误的。如果您正在寻找"干净",请尝试以下任一方法:

string * list = new string[5];
list[0] = "foo";

vector<string> list(5);
list[0] = "foo";

这两个(主观上)都比你的任何一个干净。

(1) 是一个错误,因为 list[0] 最初是 NULL,所以你有效地编写了

*NULL = *s;

你应该写

list[0] = new string;
*list[0] = *s;

或者只是

list[0] = new string(*s);

(2) 不是错误,但 *(list[0]) 只有在 *s 存在时才会存在。 如果你改变*s,那么*(list[0])也会改变。 您还应该删除 s 或 list[0],但不能同时删除两者。 除非你真的需要这种行为,否则(2)是丑陋的。

一般来说,我不明白你为什么在这里需要指针。 因此

string* list = new string[5];

会干净得多,并且

vector<string> list(5);

会更好。

最后,将某些东西称为"列表"不是一个好主意,因为有一个具有此名称的标准容器。 (既不称任何内容为"矢量"、"集合"、"字符串"、"堆栈"或"映射")。