Advertisement
TimSenin

Untitled

Oct 8th, 2022
107
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.34 KB | None | 0 0
  1. SECTION("Parameters passing") {  // Тест
  2.         auto p_int = std::make_unique<int>(42);
  3.         Pinned pinned(1312);
  4.         auto p = MakeShared<D>(pinned, std::move(p_int));  // <--- утечка здесь
  5. }
  6.  
  7. SharedPtr<X> MakeShared(Args&&... args) {  // Метод make_shared
  8.     ControlBlockHolder<X>* block = new ControlBlockHolder<X>(std::forward<Args>(args)...);  // Создаем блок
  9.     block->IncreaseCounter();
  10.     return SharedPtr<X>(block);
  11. }
  12.  
  13. SharedPtr(ControlBlockHolder<X>* block) {  // Конструктор в shared_ptr для make_shared
  14.         block_ = block;
  15.         ptr_ = block->GetPointer();  // Метод GetPointer чуть ниже
  16. };
  17.  
  18. template <typename ...Args>
  19.     ControlBlockHolder(Args&&... args) {  // Так создаем контрольный блок
  20.         new (&storage_) T(std::forward<Args>(args)...);
  21. }
  22.  
  23. T* GetPointer() {  // Получаем указатель на хранимый объект
  24.         return reinterpret_cast<T*>(&storage_);
  25. }
  26.  
  27. void DeleteObject() override {  // Удаляем хранимый объект
  28.         GetPointer()->~T();
  29. }
  30.  
  31. ~SharedPtr() {  // Удаляем shared_ptr
  32.         if (block_) {
  33.             block_->DecreaseCounter();
  34.             if (block_->GetCounter() == 0) {
  35.                 block_->DeleteObject();
  36.             }
  37.         }
  38. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement