【问题标题】:C++ raw pointer and std::shared_ptrC++ 原始指针和 std::shared_ptr
【发布时间】:2012-09-07 15:38:00
【问题描述】:

我正在与std::shared_ptr 合作,在我的软件开发过程中,我遇到了几个 让我怀疑内存管理的案例。我有一个第三方图书馆 总是给我来自函数的原始指针,在我的代码中我正在转换它们 进入std::shared_ptr(来自std而不是来自boost。顺便说一句,两者有什么区别 他们俩?)。所以假设我有以下代码:

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

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

【问题讨论】:

    标签: c++ pointers shared


    【解决方案1】:

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

    【讨论】:

    • 只是给出一个原因:shared_ptr 不考虑原始指针,因为 shared_ptr 无法知道它。如果您考虑如何自己实现 shared_ptr,那么您会发现您无法检测是否有任何指向数据的原始指针。
    • +1。此外,这就是为什么您应该在创建shared_ptr 的同一行上将new 对象放在同一行。更好的是,使用make_shared
    • 谢谢,事实上我同意没有办法找出原始指针是否指向对象。在这种情况下,原始指针只是危险的,因为它将指向一个已销毁的对象,因为 shared_ptr 将在超出范围时销毁它
    • 如果他将原始 ptr 传递给第二个 shared_ptr 会怎样,第一个 shared_ptr 还会反增加吗?
    【解决方案2】:

    没有。共享指针将删除它。

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-08-18
        • 1970-01-01
        • 2021-11-15
        • 1970-01-01
        • 1970-01-01
        • 2012-01-10
        • 1970-01-01
        相关资源
        最近更新 更多