О указателях C ++ - PullRequest
       15

О указателях C ++

1 голос
/ 06 сентября 2010

Мне любопытно, как данные обрабатываются в этой ситуации:

chapterlist.clear();
cScene newscene;
newscene.name = "Laura does something.";
newscene.words = 432;
newscene.pov = "Laura";
cChapter newchapter;
newchapter.scenelist.push_back(newscene);
chapterlist.push_back(newchapter);

chapterlist - это вектор cChapter.

Я создаю новый объект cScene и помещаю его на скейлиствектор нового объекта cChapter, который я затем помещаю в список разделов.

Мой вопрос: когда я помещаю объекты в вектор, все данные дублируются в векторе, а старые данные уничтожаются изстек, когда заканчивается область действия?

Или что-то еще происходит ???

PS: я ненавижу указатели, как и многие.

Ответы [ 6 ]

5 голосов
/ 06 сентября 2010

Когда вы помещаете что-то в вектор, объект копируется с помощью конструктора копирования. Начальное время жизни объекта будет полностью отключено от времени жизни объекта, построенного внутри вектора.

4 голосов
/ 06 сентября 2010

Мой вопрос: когда я помещаю объекты в вектор, все ли данные дублируются в векторе, а старые данные уничтожаются из стека, когда заканчивается область действия?

Да.

PS: я ненавижу указатели, как и многие

Ну, не пытайтесь, память - это просто огромный массив байтов :) Указатели - просто индексыв этот огромный массив.Когда вы обдумаете их, вы будете смеяться над тем, насколько они просты:)

3 голосов
/ 06 сентября 2010

Стандарт C ++ утверждает в главе 23, Библиотека контейнеров , что a.push_back(x) имеет операционную семантику a.insert(a.end(), x). Кроме того, утверждается, что a.insert(p, t) вставляет копию t перед p.

Так что да, копия вставляется в вектор.

2 голосов
/ 06 сентября 2010

Если у вас есть что-то вроде

struct cScene {...};
struct cChapter {
    std::vector<cScene> scenelist;
}

, тогда никакие указатели не задействуются вообще, и записи, помещенные в scenelist, будут скопированы, каждый элемент в scenelist будет уничтожен, когда cChapter установлен.

Если бы у вас было

struct cChapter {
    std::vector<cScene*> scenelist;
}

и б

cScene * newscene = new cScene;
newchapter.scenelist.push_back(newscene);

затем копируется указатель , так что теперь у вас есть два отдельных указателя на одну и ту же ячейку памяти со всеми необходимыми средствами управления временем жизни. Если элементы cScene велики, и вы не хотите копировать издержки std :: vector, взгляните на интеллектуальные указатели boost

1 голос
/ 06 сентября 2010

Ответ на ваш вопрос: да: Исходные данные будут скопированы в новую структуру внутри вектора, а затем будут уничтожены в конце стека.

Но не беспокойся слишком сильно. Здесь вы используете довольно тонкую структуру: два указателя на символ и одно целое число. Вы должны хорошо копировать это.

1 голос
/ 06 сентября 2010

А когда вы копируете объект, содержащий вектор, вектор копируется полностью.

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