禁用 std::shared_ptr 的清理

Disable the cleaning of std::shared_ptr

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

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

But then I thought maybe there is a mechanism for telling the shared_ptr to not to free the allocated memory

有:方法是保持至少一个共享指针指向它。

如果您的 API 不允许您 return 共享指针,而是强制您通过裸指针转移所有权,那么首先使用共享所有权并不是一个好主意.我会反对它。

如果您想从共享指针中获取所有权,以便即使在最后一个共享指针之后分配也不会被删除,从技术上讲,您可以使用允许转移所有权的自定义删除器。但是,如果有多个共享指针仍指向该资源,则此方法非常危险,因为要保证它们不再需要该资源并不容易。

如果您要将 new 替换为 std::unique_ptr instead, you could use std::unique_ptr::release 以获得原始指针的所有权(这样您就可以 return 它):

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();
}

你不能用共享指针轻易地做到这一点,因为共享指针本身并不拥有它自己的指针,因为你可以制作指向同一资源的共享指针的副本,所以通过一个释放所有权指针很难。