C ++: Это плохая идея использовать значение функции, возвращающей shared_ptr напрямую? - PullRequest
4 голосов
/ 18 августа 2011

Например:

boost::shared_ptr<int> test() {
    boost::shared_ptr<int> x(new int(3));
    return x;
}

void function() {
    int y = *test();
    ...
}

Является ли плохой идеей использовать shared_ptr, чтобы избежать копирования всего объекта? Например, вектор матриц / изображений.

Ответы [ 3 ]

4 голосов
/ 18 августа 2011

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

Теперь, большая проблема здесь в том, что фантастически неэффективно делать динамическое выделение памяти для int, но я предполагаю, что вы не делаете этого в реальном коде. :)

2 голосов
/ 18 августа 2011

В вашем примере это нормально, поскольку вы делаете копию int.

Если вы получите int в качестве ссылки, то после этой строки это будет зависаниессылка, так как совместно используемый указатель выйдет из области видимости, удалив его цель.

Является ли плохой идеей использовать shared_ptr, чтобы избежать копирования всего объекта?Как например вектор матриц / изображений.

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

Для вектора матриц или изображений вы можете использовать std::vector из boost::shared_ptr или boost::ptr_vector, или какой-либо другой контейнер, который делает памятьуправление легко для вас.

1 голос
/ 18 августа 2011

Я бы сказал, что да, это плохая идея.

Если вы используете указатель, есть две причины.1. Ваш объект может быть нулевым или 2. у вас есть большой объект, который вы не хотите копировать.

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

...