Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.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++ 指针和容器_C++_Stl_Containers_Smart Pointers - Fatal编程技术网

C++ 指针和容器

C++ 指针和容器,c++,stl,containers,smart-pointers,C++,Stl,Containers,Smart Pointers,我们都知道,原始指针需要封装在某种形式的智能指针中,以获得异常安全的内存管理。但当涉及到指针的容器时,问题变得更加棘手 std容器坚持所包含的对象是可复制的,因此这排除了std::auto_ptr的使用,尽管您仍然可以使用boost::shared_ptr等 但也有一些boost容器专门设计用于安全地保存指针: 见 问题是: 在什么情况下,我应该使用ptr_容器而不是智能指针容器 boost::ptr_vector<X> or std::vector<boost::shar

我们都知道,原始指针需要封装在某种形式的智能指针中,以获得异常安全的内存管理。但当涉及到指针的容器时,问题变得更加棘手

std容器坚持所包含的对象是可复制的,因此这排除了std::auto_ptr的使用,尽管您仍然可以使用boost::shared_ptr等

但也有一些boost容器专门设计用于安全地保存指针:

问题是: 在什么情况下,我应该使用ptr_容器而不是智能指针容器

boost::ptr_vector<X>

or

std::vector<boost::shared_ptr<X> >
boost::ptr_向量
或
向量

嗯,开销是一种情况

共享指针的向量将进行大量无关的复制,包括创建新的智能指针、递增引用、递减引用等。使用指针容器可以避免所有这一切


需要分析以确保容器操作是瓶颈:)

Boost指针容器对其所持有的资源拥有严格的所有权。std::vector具有共享所有权。这可能有必要的原因,但如果不是,我会默认使用boost::ptr_vector。YMMV.

稳定:智能指针是处理资源管理的一种非常好的方法,但不是唯一的方法。我同意你会看到很少的原始指针在写得好的C++代码中,但是在我的经验中你也没有看到很多智能指针。有很多完全例外安全的类是使用原始指针容器实现的。

这是可能的,有时也是最好的选择,但是如果一个类包含2个或更多的原始指针,使其例外安全是非常重要的。但是我应该记下你没有回答这个问题。