Ответ 1
Нет, не будет. Предоставляя указатель на shared_ptr, вы даете shared_ptr ответственность за его удаление. Это будет сделано, если последний объект shared_ptr, ссылающийся на него, больше не существует. Исходные указатели не учитываются.
Я работаю с std::shared_ptr
, и во время разработки программного обеспечения я встретил пару
случаев, которые позволяют мне сомневаться в управлении памятью. У меня была сторонняя библиотека, которая
дал мне всегда сырые указатели от функций, и в моем коде я преобразовал их
в std::shared_ptr
(от std, а не от boost. Кстати, в чем разница между
два?). Итак, скажем, у меня есть следующий код:
ClassA* raw = new ClassA;
std::shared_ptr<ClassA> shared(raw);
Что происходит, когда общий указатель выходит из области видимости (скажем, он был объявлен локально в функции
и теперь я покидаю функцию). Будет ли объект ClassA
еще существовать, потому что необработанный указатель
указывает на это?
Нет, не будет. Предоставляя указатель на shared_ptr, вы даете shared_ptr ответственность за его удаление. Это будет сделано, если последний объект shared_ptr, ссылающийся на него, больше не существует. Исходные указатели не учитываются.
нет. Общий указатель удалит его.
Если у вас есть сторонняя библиотека, снабжающая указатель, вы должны быть уверены, что вы удалите ее правильно. Если, например, сторонняя библиотека выделяла его "malloc", вам нужно использовать реализацию "free", которую использует lib. Вы должны быть уверены, как это было выделено.
Предлагает ли библиотека способ уничтожить объекты, которые она вам предоставляет? В этом случае вы должны использовать эту функцию для ее уничтожения.
Нет, объект ClassA
будет уничтожен. Если вы не скопировали shared_ptr
где-то вне области видимости, поэтому его счетчик ссылок равен > 1.