C++ 禁用清理std::shared\u ptr

C++ 禁用清理std::shared\u ptr,c++,c++11,pointers,std,C++,C++11,Pointers,Std,我目前正在重构代码的一些旧部分。我正在研究的方法是大量使用new和delete功能来实现其目的。我可以很容易地用共享指针替换所有这些,以提高代码的清晰度和安全性。问题是,最后我需要返回一个指向分配内存的指针,以匹配API。这不适用于共享指针 我可以用new分配一个新的内存块,并复制shared\u ptr分配的内存内容(我的第一个想法)。但后来我想,也许有一种机制可以告诉共享\u ptr不要在上下文丢失时释放分配的内存?通过这种方式,我可以通过共享ptr将指针返回到分配的内存,而无需释放它 但是

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

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

但是我想也许有一种机制可以告诉共享的ptr不要释放分配的内存

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

如果您的API不允许您返回共享指针,而是强制您通过裸指针转移所有权,那么首先使用共享所有权并不是一个好主意。我建议不要这样做


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

如果要将新的
替换为,则可以使用获取原始指针的所有权(以便返回它):

T*oldfn(){
T*ptr=新的T(参数…);
//使用`ptr`
删除ptr;
T*ptr2=新的T(参数…);
//使用`ptr2`
返回ptr2;
}
//变成
T*newfn(){
std::unique_ptr ptr{new T(args…};
//使用`ptr.get()`
//我将删除
std::unique_ptr ptr2{new T(args…};
//使用`ptr2.get()`
返回ptr2.release();
}

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

这个答案似乎解决了您的问题:很好的解决方案。在Qt世界中,这是
QSharedPointer
shared\u ptr
)和
QScopedPointer
unique\u ptr
)。您帮助我认识到,我应该经常使用唯一指针,而不是共享指针,因为唯一指针对于工作来说已经足够了(就像这里一样,可以放弃所有权)。谢谢谢谢你的回答。我曾想过使用定制的deleter(实际上不会删除任何内容)来解决这个问题,但它似乎有点黑客化。谢谢你的解释。