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

Я нашел это сообщение , который указывает, что действительно нет никакого лучшего способа удалить записи. Данное объяснение состояло в том, что все внешние ключи, отношения и т.д., которые уникальны для этой записи, также удалены, и таким образом, EF должен иметь корректную информацию о записи. Я озадачен тем, почему это не могло быть достигнуто, не загружая данные назад и вперед, но поскольку они не собираются происходить очень часто, я решил (на данный момент), что не обеспокоюсь.

, Если у Вас действительно есть решение этой проблемы, не стесняйтесь сообщать мне =)

6
задан Ryan McDonough 27 September 2012 в 12:10
поделиться

7 ответов

Используйте инструмент boost bcp . Это позволит вам извлечь определенные функции из расширенных библиотек.

bcp shared_ptr /boost_shared_ptr

будет извлекать shared_ptr и его зависимости в этот каталог.

17
ответ дан 8 December 2019 в 03:39
поделиться

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

4
ответ дан 8 December 2019 в 03:39
поделиться

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

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

3
ответ дан 8 December 2019 в 03:39
поделиться

Хотя это было бы ужасной идеей для производственного решения, было бы не так уж сложно применить свою собственную для класса, если бы вы не пытались быть таким же кросс-компилятором, гибким и поточно-ориентированным, как у 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_;
};
1
ответ дан 8 December 2019 в 03:39
поделиться
#include <tr1/memory> // this is contained in STL.
std::tr1::shared_ptr<A> a = new A;

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

1
ответ дан 8 December 2019 в 03:39
поделиться

Вы действительно так нуждаетесь в долевой собственности?

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

Управление памятью без RAII затруднительно, но вы получаете RAII без shared_ptr . 1136716]

1
ответ дан 8 December 2019 в 03:39
поделиться

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

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

вместо

ref_count_(p ? new int : NULL)

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

1
ответ дан 8 December 2019 в 03:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: