Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- SECTION("Parameters passing") { // Тест
- auto p_int = std::make_unique<int>(42);
- Pinned pinned(1312);
- auto p = MakeShared<D>(pinned, std::move(p_int)); // <--- утечка здесь
- }
- SharedPtr<X> MakeShared(Args&&... args) { // Метод make_shared
- ControlBlockHolder<X>* block = new ControlBlockHolder<X>(std::forward<Args>(args)...); // Создаем блок
- block->IncreaseCounter();
- return SharedPtr<X>(block);
- }
- SharedPtr(ControlBlockHolder<X>* block) { // Конструктор в shared_ptr для make_shared
- block_ = block;
- ptr_ = block->GetPointer(); // Метод GetPointer чуть ниже
- };
- template <typename ...Args>
- ControlBlockHolder(Args&&... args) { // Так создаем контрольный блок
- new (&storage_) T(std::forward<Args>(args)...);
- }
- T* GetPointer() { // Получаем указатель на хранимый объект
- return reinterpret_cast<T*>(&storage_);
- }
- void DeleteObject() override { // Удаляем хранимый объект
- GetPointer()->~T();
- }
- ~SharedPtr() { // Удаляем shared_ptr
- if (block_) {
- block_->DecreaseCounter();
- if (block_->GetCounter() == 0) {
- block_->DeleteObject();
- }
- }
- };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement