Re: shared_ptr и его delete`ер
От: rg45 СССР  
Дата: 08.10.13 20:39
Оценка: 87 (3)
Здравствуйте, niXman, Вы писали:

X>есть объект shared_ptr. этому объекту я устанавливаю свой delete`ер.

X>внимание вопрос: счетчик ссылок этого shared_ptr`а изменяется в момент входа в delete`ер, или в момент выхода?

Счетчик — это деталь реализации умного указателя, верить в его существование, конечно, можно, но полагаться не стоит (c). Я так понимаю, вопрос в том, можно ли внутри делетера восстановить экземпляр shared_ptr'а удаляемого объекта? Здравый смысл и несложный эксперимент подсказывают, что нет:

http://ideone.com/IIw8FU#sthash.dANBEuoG.eurfLEHz.dpuf

#include <iostream>
#include <memory>

int main() 
{
    std::weak_ptr<int> weakPtr;
    auto deleter = [&](int* targetPtr) 
    {
        std::cout 
            << "- Can we restore a shared pointer in its deleter?\n"
            << "- " << (weakPtr.lock().get() ? "Yes." : "No.") << std::endl;
        delete targetPtr;
    };
    std::shared_ptr<int> sharedPtr(new int(), deleter);
    weakPtr = sharedPtr;
    std::cout 
        << "- Has the shared pointer been created?\n"
        << "- " << (weakPtr.lock().get() ? "Yes." : "No.") << std::endl;
}

Output:
- Has the shared pointer been created?
- Yes.
- Can we restore a shared pointer in its deleter?
- No.
--
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.