禁用 std::shared_ptr 的清理

Bre*_*men -1 c++ pointers std c++11

我目前正在重构代码的一些旧部分。我正在研究的方法大量使用newdelete功能来实现其目的。我可以轻松地用共享指针替换所有这些,以获得更好的代码清晰度和安全性。问题是,最终我需要返回一个指向已分配内存的指针以匹配 API。这不适用于共享指针。

我可以分配一个新的内存块并new复制分配的内存内容shared_ptr(我的第一个想法)。但后来我想也许有一种机制可以告诉shared_ptr不要在上下文丢失时释放分配的内存?这样我就可以通过共享 ptr 返回指向已分配内存的指针,而无需释放它。

Art*_*yer 5

如果您要将 替换newstd::unique_ptr,则可以使用std::unique_ptr::release来获取原始指针的所有权(这样您就可以返回它):

T* oldfn() {
    T* ptr = new T(args...);
    // use `ptr`
    delete ptr;
    T* ptr2 = new T(args...);
    // use `ptr2`
    return ptr2;
}

// Becomes

T* newfn() {
    std::unique_ptr<T> ptr{ new T(args...) };
    // use `ptr.get()`
    // RAII will delete
    std::unique_ptr<T> ptr2{ new T(args...) };
    // use `ptr2.get()`
    return ptr2.release();
}
Run Code Online (Sandbox Code Playgroud)

您无法使用共享指针轻松地做到这一点,因为共享指针本身并不拥有该指针,因为您可以复制指向同一资源的共享指针,因此通过一个指针释放所有权是很困难的。