Странная проблема с конструктором, называемым вектором <T> - PullRequest
1 голос
/ 05 февраля 2011
vector< MyObject<MyType> > ObjectList(100, MyObject<MyType>(param1));

MyObject внутренне создает элемент с именем 'storage', который представляет собой массив MyType, использующий в куче.

Но используйте приведенную выше строку кода, каждый элемент в ObjectList имеет указание 'storage'в одну и ту же область памяти (по существу разделяя хранилище).

Эта проблема не возникает, когда я распределяю список в стеке вручную, используя

MyObject<MyType> ObjectList[100] = { MyObject<MyType>(param1), 
                                     MyObject<MyType>(param1), ...};

Каждое хранилище имеет свою собственную область памяти, когдаЯ объявляю MyObject с вышеуказанной строкой.

Ответы [ 2 ]

9 голосов
/ 05 февраля 2011

Но используйте приведенную выше строку кода, каждый элемент в ObjectList имеет «хранилище», указывающее на одну и ту же область памяти (по существу, разделяющее хранилище).

Если вы написали правильноконструктор копирования для MyObjectMyType, если он также содержит указатели), тогда этого не произойдет, потому что ObjectList инициализируется с копиями того, что вы передаете.

Под «правильным» я подразумевал copy-ctor, который делает глубокое копирование вместо мелкое копирование !

См. Это:

В чем разница между глубокой и мелкой копиями?

2 голосов
/ 05 февраля 2011

Чтобы расширить приведенные выше ответы, нужно разбить строку кода:

vector< MyObject<MyType> > ObjectList(100, MyObject<MyType>(param1))

на две составляющие:

MyObject<MyType> myObject(param1)vector< MyObject<MyType> > ObjectList(100, myObject)

Как вы можете видеть, вы создаете myObject один раз, а затем вызываете его конструктор копирования 100 раз (вместо создания 100x MyObjects).

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

Я бы также рекомендовал не использовать голые указатели / выделение кучи (например, MyType * t = new MyType [param1]) new внутри MyObject, скорее реализуйте хранилище с другим вектором, который уже поддерживает механизмы копирования, которые вы, вероятноожидать.

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