禁用 std::shared_ptr 的清理
Disable the cleaning of std::shared_ptr
我目前正在重构代码的一些旧部分。我正在研究的方法大量使用 new
和 delete
功能以实现其目的。我可以轻松地将所有这些替换为共享指针,以获得更好的代码清晰度和安全性。问题是,最后我需要 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();
}
你不能用共享指针轻易地做到这一点,因为共享指针本身并不拥有它自己的指针,因为你可以制作指向同一资源的共享指针的副本,所以通过一个释放所有权指针很难。
我目前正在重构代码的一些旧部分。我正在研究的方法大量使用 new
和 delete
功能以实现其目的。我可以轻松地将所有这些替换为共享指针,以获得更好的代码清晰度和安全性。问题是,最后我需要 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();
}
你不能用共享指针轻易地做到这一点,因为共享指针本身并不拥有它自己的指针,因为你可以制作指向同一资源的共享指针的副本,所以通过一个释放所有权指针很难。