Использование std :: shared_ptr - PullRequest
5 голосов
/ 26 марта 2012

Как я могу использовать std :: shared_ptr для массива double?Кроме того, каковы преимущества / недостатки использования shared_ptr.

Ответы [ 2 ]

9 голосов
/ 26 марта 2012

Это зависит от того, что вы ищете.Если вы просто хотите получить массив двойных размеров с изменяемым размером, перейдите с

std::vector<double>

Пример:

std::vector<double> v;
v.push_back(23.0);
std::cout << v[0];

Если для вас важно владеть правами владения указанным массивом, используйте, например,

std::shared_ptr<std::vector<double>>

Пример:

std::shared_ptr<std::vector<double>> v1(new std::vector<double>);
v1->push_back(23.0);
std::shared_ptr<std::vector<double>> v2 = v1;
v2->push_back(9.0);
std::cout << (*v1)[1];

В качестве альтернативы, Boost имеет

boost::shared_array

, который служит аналогичной цели.Смотрите здесь:

http://www.boost.org/libs/smart_ptr/shared_array.htm

Что касается нескольких преимуществ / недостатков shared_ptr, то:

Плюсы

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

Минусы

  • Затраты памяти для хранения счетчика ссылок могут быть значительными для небольших объектов
  • Производительность может быть хуже, чем для необработанных указателей (но измерить это)
5 голосов
/ 26 марта 2012

Вы также можете предоставить средство удаления массива:

template class ArrayDeleter {
public:
    void operator () (T* d) const
    { delete [] d; }
};

int main ()
{
    std::shared_ptr array (new double [256], ArrayDeleter ());
}
...