Достойная реализация shared_ptr, которая не требует огромной библиотеки?

StackOverflow https://stackoverflow.com/questions/1512520

  •  19-09-2019
  •  | 
  •  

Вопрос

Прямо сейчас я посещаю курс программирования на C ++ по ГИС-программированию.Я действительно начинаю испытывать много головной боли из-за правильного управления памятью.Учитывая, что в любой момент времени часто существует 8-10 классов, каждый из которых содержит указатель на 3D-матрицу или что-то еще очень большого размера.Теперь наш класс уже поднял вопрос о том, что prof позволяет нам использовать Boost или, по крайней мере, пакет функций C ++ для 2008 (для TR1).Он отказался, но сказал, что если мы захотим, то можем найти несколько сторонних файлов cpp / hpp.Я уже пытался рассмотреть возможность извлечения shared_ptr из boost, но это скорее головная боль, чем ее ценность.

Итак, существует ли какая-либо бесплатная реализация shared_ptr?

Это было полезно?

Решение

Используйте ускорение БКП инструмент.Это позволит вам извлечь определенные функции из библиотек повышения.

bcp shared_ptr /boost_shared_ptr

извлечет общий_ptr и его зависимости в этот каталог.

Другие советы

Давать Локис Умный указатель с подсчетом ссылок - насколько я помню, он менее связан, а затем увеличивает заголовки.

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

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

Хотя это было бы ужасный идея для производственного решения, было бы не так уж сложно реализовать собственное решение для класса, если бы вы не пытались быть таким же кросс-компилятором, гибким и потокобезопасным, как Boost:

template <typename contained>
class my_shared_ptr {
public:
   my_shared_ptr() : ptr_(NULL), ref_count_(NULL) { }

   my_shared_ptr(contained * p)
     : ptr_(p), ref_count_(p ? new int : NULL)
   { inc_ref(); }

   my_shared_ptr(const my_shared_ptr& rhs)
     : ptr_(rhs.p), ref_count_(rhs.ref_count_)
   { inc_ref(); }

   ~my_shared_ptr() {
     if(ref_count_ && 0 == dec_ref()) { delete ptr_; delete ref_count_; }
   }
   contained * get() { return ptr_; }
   const contained * get() const { return ptr_; }

   void swap(my_shared_ptr& rhs) // throw()
   {
      std::swap(p, rhs.p);
      std::swap(ref_count_, rhs.ref_count_);
   }

   my_shared_ptr& operator=(const my_shared_ptr& rhs) {
        my_shared_ptr tmp(rhs);
        this->swap(tmp);
        return *this;
   }

   // operator->, operator*, operator void*, use_count
private:
   void inc_ref() {
      if(ref_count_) { ++(*ref_count_); }
   }

   int  dec_ref() {
      return --(*ref_count_);
   }

   contained * ptr_;
   int * ref_count_;
};
#include <tr1/memory> // this is contained in STL.
std::tr1::shared_ptr<A> a = new A;

ой, только что увидел, что твой профессор не позволяет тебе использовать TR1.везет, как утопленнику.

Неужели вам так нужна долевая собственность?

Часто можно обойтись простым специальным классом RAII, принимая на себя исключительное право владения объектом.

Управление памятью без RAII — это проблема, но вы можете получить RAII и без него. shared_ptr.

Я только что заметил серьезную ошибку в вашем примере кода.Это должно быть

ref_count_(p ? new int(0) : NULL)

вместо того, чтобы

ref_count_(p ? new int : NULL)

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top