分享
三行代码  ›  专栏  ›  技术社区  ›  octopus

使用std::shared_ptr<T>.get()函数返回的指针删除对象?

  •  -1
  • octopus  · 技术社区  · 2 天前
    int main(int argc, char *argv[])
    {
        auto sp = std::make_shared<int>();
        auto p = sp.get();
        delete p; //here
        std::cout << *sp << std::endl;
    
        return 0;
    }
    

    我希望 shared_ptr sp 将被注释为“here”的语句删除,但对象保持完整并打印在输出语句中。

    • 因为我没有创建由 shared_ptr 显式地 new 新的 语句必须有对应的 delete 声明,因此 语句,较早的对应 新的 关键词?)?
    • 共享的 s、 创建自 make_shared 函数只被 共享的
    3 回复  |  直到 2 天前
        1
  •  1
  •   Jesper Juhl    2 天前

    这个 shared_ptr 不认识你 delete 你得到的指针 .get() . 所以当 共享的 它自己会被摧毁的 尝试 导致双重删除的对象 undefined behaviour . 另外,取消引用指向已删除对象的指针是 乌兰巴托。

    删除 删除 你是 不允许 (在调用UB的痛苦中)再次访问对象。

    你的程序是无效的 任何东西 允许编译器生成。

        2
  •  1
  •   Ðаn    2 天前

    “管理”与 shared_ptr RAII ( 资源 获得 s公司

    对于您的代码:

    int main(int argc, char *argv[])
    {
        {
           auto sp = std::make_shared<int>();
           std::cout << *sp << std::endl;
        }
        // memory is now delete'd because "sp" is out-of-scope
    
        return 0;
    }
    

    共享的 事实上,事情可能(相当复杂)比多重 共享的 最后的

    你的偏好应该是使用 std::unique_ptr 直到你真正需要 共享的

        3
  •  0
  •   Zuodian Hu    2 天前

    首先,如果你这样做,你的对象将被删除两次,如果你幸运的话,你将崩溃。

    第二,仅仅因为某些内容被删除并不意味着它的底层表示肯定是无效的。您可能会遇到内存被释放的情况,但是还没有任何东西来覆盖以前的内容。