присвоение значений указателям - PullRequest
1 голос
/ 12 мая 2011

Если a имеет массив указателей на объект, какой способ заполнения массива является более чистым, (1) или (2), в сегменте кода ниже? Есть

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

Ответы [ 3 ]

3 голосов
/ 12 мая 2011

Первый метод приведет к неопределенному поведению.list[0] не указывает на действительный string объект, поэтому разыменование и присвоение ему будет плохим.

Второй метод мне подходит (в том смысле, что он не будет неопределенным).поведение), но я думаю, это зависит от того, как вы продолжаете его использовать.

0 голосов
/ 12 мая 2011

(1) - ошибка, поскольку list [0] изначально имеет значение NULL, поэтому вы фактически написали

*NULL = *s;

Вместо этого вы должны написать

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

или просто

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

(2) не является ошибкой, но * (список [0]) будет существовать только до тех пор, пока существует * s.Если вы измените * s, то * (список [0]) также изменится.Вы также должны удалить либо s, либо list [0], но не оба.Если вам действительно не нужно это поведение, (2) уродливо.

В общем, я не понимаю, зачем вам здесь указатели.Следовательно,

string* list = new string[5];

будет намного чище, а

vector<string> list(5);

будет еще лучше.

Наконец, не стоит называть что-то "списком"msgstr ", так как есть стандартный контейнер с этим именем.(Не называйте ничего «vector», «set», «string», «stack» или «map»).

0 голосов
/ 12 мая 2011

Трудно сказать, не видя остальную часть вашей программы, но оба эти кажутся неправильными.Если «чистый» - это то, что вы ищете, попробуйте любой из них:

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

или

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

Оба из них (субъективно) чище, чем любой из ваших.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...