18

在我std::shared_ptr的软件开发过程中,我遇到了几个让我怀疑内存管理的案例。我有一个第三方库,它总是给我来自函数的原始指针,并且在我的代码中我将它们转换为std::shared_ptr(来自 std 而不是来自 boost。顺便说一下,两者之间有什么区别?)。所以假设我有以下代码:

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

当共享指针超出范围时会发生什么(假设它是在函数中本地声明的,现在我正在退出函数)。该ClassA对象是否仍然存在,因为原始指针指向它?

4

3 回答 3

29

不,不会的。通过将原始指针指向shared_ptr,您shared_ptr将负责删除它。shared_ptr当引用您的ClassA实例的最后一个对象不再存在时,它将执行此操作。原始指针不算数。

于 2012-09-14T12:58:48.950 回答
5

不。共享指针将删除它。

如果您有第三方库为您提供指针,则需要确保以正确的方式删除它。例如,如果第 3 方库使用“malloc”分配它,那么您需要使用该库使用的“免费”实现。您需要确定它是如何分配的。

该库是否提供了一种方法来销毁它为您提供的对象?在这种情况下,您应该使用该函数来销毁它。

于 2012-09-14T13:01:26.337 回答
2

不,ClassA对象将被销毁。除非您没有复制shared_ptr超出范围的某个位置,否则它的引用计数器 > 1。

于 2012-09-14T13:00:03.977 回答