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
似乎也不是一个阻碍表演的工具。我认为,做自己的智能指针实现是对基于模板的编程的一个很好的介绍。