C++ 可重用std::共享的ptr
是否可以使C++ 可重用std::共享的ptr,c++,c++17,C++,C++17,是否可以使std::shared_ptr不删除对象,而是将其移动到列表中 #include <memory> #include <list> struct QObject { double socialDistance; }; int main() { std::list<QObject *> free_objects; std::list<QObject *> used_objects; QObject* p
std::shared_ptr
不删除对象,而是将其移动到列表中
#include <memory>
#include <list>
struct QObject { double socialDistance; };
int main()
{
std::list<QObject *> free_objects;
std::list<QObject *> used_objects;
QObject* p_object = new QObject{10};
free_objects.push_back(p_object);
{
std::shared_ptr<QObject> p(p_object);
}
//At this point p_object is moved from free_objects to used_objects,
//so I reuse the object later.
return 0;
}
#包括
#包括
结构QObject{double socialDistance;};
int main()
{
列出自由的对象;
std::列出使用的对象;
QObject*p_object=新的QObject{10};
释放对象。向后推(p对象);
{
std::shared_ptr p(p_对象);
}
//此时,p_对象从自由_对象移动到已使用的_对象,
//所以我以后会重用这个对象。
返回0;
}
如果是,是否不仅可以重用对象,还可以重用控制块以避免内存重新分配
是否可以使std::shared_ptr不删除对象,而是将其移动到列表中
#include <memory>
#include <list>
struct QObject { double socialDistance; };
int main()
{
std::list<QObject *> free_objects;
std::list<QObject *> used_objects;
QObject* p_object = new QObject{10};
free_objects.push_back(p_object);
{
std::shared_ptr<QObject> p(p_object);
}
//At this point p_object is moved from free_objects to used_objects,
//so I reuse the object later.
return 0;
}
您可以为此使用自定义删除器:
std::shared_ptr<QObject> p(p_object, [&](QObject* p){
used_objects.push_back(p);
auto it = std::find(free_objects.begin(), free_objects.end(), p);
if (it != free_objects.end()) free_objects.erase(it);
});
std::shared_ptr p(p_对象,[&](QObject*p){
使用的对象。向后推(p);
auto it=std::find(free_objects.begin(),free_objects.end(),p);
如果(it!=free_objects.end())free_objects.erase(it);
});
我不知道是否可以使用
std::shared\u ptr
来实现这一点,但是,创建自己的克隆来满足您的需要似乎并不困难。您几乎可以使用自定义删除器执行任何操作。@MarkRansom然后我需要克隆std::weak_ptr to您无法控制标准库如何管理控制块。理论上,您可以为挂起块的原始内存的shared_ptr
编写一个自定义分配器。但对我来说,这似乎比它的价值更麻烦。如果你需要的话,克隆std::weak_ptr
似乎也不是一个阻碍表演的工具。我认为,做自己的智能指针实现是对基于模板的编程的一个很好的介绍。