Преобразовать локальный объект в указатель, не копируя данные? - PullRequest
3 голосов
/ 28 октября 2011

У меня есть класс cnList , в котором хранится гибкое количество элементов.Этот список позже должен быть преобразован в объект cnArray .Класс списка уже реализует метод cnArray cnList::toArray() const.

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

Теперь, настоящая проблема в том, что просто использовать адрес массива нельзя, поскольку он освобождается после завершения метода, в котором я сейчас нахожусь.

Могу ли я как-то "преобразовать" этот объект вуказатель и объект больше не освобождается?
Конечно, я мог бы скопировать все записи из массива объектов в массив с указателями, но это не то, что я хочу, так как это не очень эффективно.

Мне известно о том, что я мог бы реализовать метод в cnList , который возвращает указатель на объект cnArray , но я хотел бы знать, есть ли вокруг этого.

Ответы [ 4 ]

4 голосов
/ 28 октября 2011

Вы можете выделить новый массив cnArray из кучи, созданный из возвращаемого значения toArray.Если вы все сделаете правильно, Оптимизация возвращаемого значения позволит компилятору оптимизировать избыточную копию:

cnArray *p = new cnArray(list.toArray());

Чтобы увидеть, что RVO g ++ устранит копию, см. http://ideone.com/loXAT

0 голосов
/ 28 октября 2011

cnList копируется в новый cnArray. Функция cnArray::ToList могла быть написана для принятия ссылки или указателя на существующий массив cnArray, но это не так. Если вы можете изменить интерфейс, вы должны учитывать это.

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

Некоторые компиляторы C ++ делают copy elision , что предотвращает создание лишней копии. Вместо присвоения возвращаемого значения временному, присвойте его непосредственно переменной-члену.

0 голосов
/ 28 октября 2011

В cnList::toArray() вы можете динамически выделить cnArray* obj, преобразовать ваш cnList объект в obj и затем вернуть obj.Поскольку вы передаете необработанный (или умный) указатель обратно, он не будет освобожден, когда выйдет из области видимости.

0 голосов
/ 28 октября 2011

Указатели могут быть почтительными и использоваться как обычные местные жители.Проблема в том, что вы не конвертируете автоматический объект в выделенную кучу, а просто используете объект heap.Однако я бы посоветовал использовать shared_ptr, если это возможно.

cnArray* Ptr = new cnArray();
(*Ptr) = cnList::toArray();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...