Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 是否有一个boost智能指针类可以配置为在销毁时不删除?_C++_Boost_Smart Pointers - Fatal编程技术网

C++ 是否有一个boost智能指针类可以配置为在销毁时不删除?

C++ 是否有一个boost智能指针类可以配置为在销毁时不删除?,c++,boost,smart-pointers,C++,Boost,Smart Pointers,我有一个智能指针列表。我希望这些智能指针中的一些充当常规指针,这意味着它们只是对实例的引用,不涉及实例的释放。例如,它们可能指向堆栈上分配的实例。列表中的其他智能指针应充当常规boost::shared_ptr 下面是该类的外观: template<class T> smart_ptr { private: T *p; boost::shared_ptr<T> sp; public: smart_ptr(T *p): p(p), shared(0)

我有一个智能指针列表。我希望这些智能指针中的一些充当常规指针,这意味着它们只是对实例的引用,不涉及实例的释放。例如,它们可能指向堆栈上分配的实例。列表中的其他智能指针应充当常规boost::shared_ptr

下面是该类的外观:

template<class T> smart_ptr {
private:
    T *p;
    boost::shared_ptr<T> sp;
public:
    smart_ptr(T *p): p(p), shared(0) { } // p will not be deleted
    smart_ptr(boost::shared_ptr<T> &sp): p(sp.get()), sp(sp) { }
    T *get() const { return p; }
}
模板智能\u ptr{
私人:
T*p;
boost::共享的ptr sp;
公众:
智能ptr(T*p):p(p),共享(0){}//p不会被删除
smart_ptr(boost::shared_ptr&sp):p(sp.get()),sp(sp){}
T*get()常量{return p;}
}

如果有一个boost类可以做到这一点,我宁愿使用它,而不是自己编写一个类。似乎没有,或者我弄错了?

共享的一个构造函数采用析构函数方法,您可以传入一个空的函子


(您只需要一个空函数。)

这听起来像是一个boost::weak\u ptr:


但是您只能从共享的\u ptr创建一个弱的\u ptr,因此对于堆栈分配的对象,我不确定该如何工作。

我的工具箱中有一个用于此的小类:

struct nodelete {
    template <typename T>
    void operator()( T * ) {}
};
struct节点节点{
模板
void运算符()(T*){}
};
用法:

int main() {
    SomeClass sc;
    boost::shared_ptr<SomeClass> p( &sc, nodelete() );
    // ...
}
intmain(){
sc类;
boost::shared_ptr p(&sc,nodelete());
// ...
}

这种设计有点糟糕

我想不出一个合理的情况,你不想删除指针。以下是(不合理的)情况:

1) 静态持续时间对象。相反,考虑使用一个单独的MIXIN(使用CRTP来混合一个具有一个Stand()方法的单体,该方法返回一个本地静态SysDypTR的副本;本地静态是线程不安全的,因此如果需要多个线程调用,您还需要一个适当的静态互斥体)。使用适当的单例的好处是,当其他对象继续持有共享的ptr时,您的单例将在退出时被销毁

2) 在堆栈上创建的对象。别这样。而是在受共享\u ptr保护的堆上创建对象。如果您需要在代码的不同部分为对象创建共享的\u ptr(即,您不能从原始共享的\u ptr复制),则从boost::enable_shared_from_this()继承,并从共享的\u from_this()获取共享的\u ptr


是否还有其他原因使您希望共享的\u ptr永远不会删除任何内容?

但是您能否将共享的\u ptr与同一列表中的不同删除者混合匹配?它们会变成不同的类型,对吗?不,删除器不是共享类型的一部分,所以是的,你可以在同一个集合中混合和匹配不同的删除器。我相信TR1标准排除了这种技术;即使您指定了自定义析构函数,删除指针也需要定义良好。@Earwicker:不,谢天谢地(Earwicker删除了这样的答案,但没有删除注释)。感谢您的回答!这使我摆脱了一个糟糕的局面,即一个遗留模块只提供对象引用,而另一个模块只接受共享的ptr。使用空的析构函数,我能够提供一个共享的\u ptr,它不会删除第一个模块拥有的对象。如果所需的指针不是要释放指针对象,那么它的“智能”部分是什么?你想从这个普通的旧指针(T*)中得到什么?OP希望这两个指针都具有相同的静态类型,这样他就可以在一个集合中混合拥有和不拥有实例。