С++ raw pointer и std:: shared_ptr

Я работаю с std::shared_ptr, и во время разработки программного обеспечения я встретил пару случаев, которые позволяют мне сомневаться в управлении памятью. У меня была сторонняя библиотека, которая дал мне всегда сырые указатели от функций, и в моем коде я преобразовал их в std::shared_ptr (от std, а не от boost. Кстати, в чем разница между два?). Итак, скажем, у меня есть следующий код:

ClassA* raw = new ClassA;
std::shared_ptr<ClassA> shared(raw);

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

Ответы

Ответ 1

Нет, не будет. Предоставляя указатель на shared_ptr, вы даете shared_ptr ответственность за его удаление. Это будет сделано, если последний объект shared_ptr, ссылающийся на него, больше не существует. Исходные указатели не учитываются.

Ответ 2

нет. Общий указатель удалит его.

Если у вас есть сторонняя библиотека, снабжающая указатель, вы должны быть уверены, что вы удалите ее правильно. Если, например, сторонняя библиотека выделяла его "malloc", вам нужно использовать реализацию "free", которую использует lib. Вы должны быть уверены, как это было выделено.

Предлагает ли библиотека способ уничтожить объекты, которые она вам предоставляет? В этом случае вы должны использовать эту функцию для ее уничтожения.

Ответ 3

Нет, объект ClassA будет уничтожен. Если вы не скопировали shared_ptr где-то вне области видимости, поэтому его счетчик ссылок равен > 1.