随着新的标准的到来(和一些编译器已经可用的部分),新的std::unique_ptrtypes应该是std::auto_ptr的替代品。 他们的使用是否完全重叠(所以我可以在我的代码上进行全局查找/replace(不是我会这样做,但是如果我这样做)),还是应该知道读取文档中不明显的一些差异? 另外,如果它是一个直接replace(为什么给它一个新的名字),而不是改善std::auto_ptr 。
我开始研究C ++ 11的智能指针,我没有看到任何有用的std::weak_ptr 。 有人可以告诉我什么时候std::weak_ptr是有用的/必要的?
我有一系列返回unique_ptr<Base>的工厂。 然而,它们提供了指向各种派生types的指针,即unique_ptr<Derived> , unique_ptr<DerivedA> , unique_ptr<DerivedB>等。 鉴于DerivedA : Derived和Derived : Base我们会有: unique_ptr<Base> DerivedAFactory() { return unique_ptr<Base>(new DerivedA); } 我需要做的就是将指针从返回的unique_ptr<Base>到某个派生级别(不一定是原来的内部级别)。 为了说明伪代码: unique_ptr<Derived> ptr = static_cast<unique_ptr<Derived>>(DerivedAFactory()); 我正在考虑通过从unique_ptr释放对象,然后使用一个函数来转换原始指针并将其重新分配给另一个所需flavor的unique_ptr ( release将在调用之前由调用方明确完成): unique_ptr<Derived> CastToDerived(Base* obj) { return unique_ptr<Derived>(static_cast<Derived*>(obj)); } 这是有效的,还是会有一些质朴的事情呢? PS。 还有一个复杂的问题,一些工厂驻留在运行时dynamic加载的DLL中,这意味着我需要确保生成的对象在创build时在相同的上下文(堆空间)中被销毁。 所有权的转移(通常发生在另一个环境中)必须从原始上下文中提供一个删除者。 但是除了必须提供/删除指针以外,投射问题应该是相同的。
std::unique_ptr支持数组,例如: std::unique_ptr<int[]> p(new int[10]); 但是它需要? 可能使用std::vector或std::array会更方便。 你觉得这个构造有什么用处吗?
比较,优点,缺点和何时使用? 这是一个垃圾收集线程的分拆,我认为这是一个简单的答案,产生了一些关于一些特定的智能指针实现的评论,所以似乎值得开始一个新的职位。 最终问题是C ++中的智能指针的各种实现是什么,它们是如何比较的? 只是简单的优点和缺点或exception和陷阱,你可能认为应该工作。 我已经发布了一些我已经使用过的或至less已经被掩盖的实现,并被认为是作为下面的答案,并且我的理解可能不是100%准确的差异和相似之处,所以请随时根据需要进行事实核查或纠正。 目标是了解一些新的对象和库,或者纠正我对已经广泛使用的现有实现的使用和理解,并最终为其他人提供一个体面的参考。
这个程序有什么问题? #include <memory> #include <vector> int main() { std::vector<std::unique_ptr<int>> vec; int x(1); std::unique_ptr<int> ptr2x(&x); vec.push_back(ptr2x); //This tiny command has a vicious error. return 0; } 错误: $ g++ -std=gnu++0x main.cpp In file included from c:\mingw\bin\../lib/gcc/mingw32/4.5.0/include/c+ +/mingw32/bits/c++allocator.h:34:0, from c:\mingw\bin\../lib/gcc/mingw32/4.5.0/include/c+ +/bits/allocator.h:48, from c:\mingw\bin\../lib/gcc/mingw32/4.5.0/include/c+ +/memory:64, from main.cpp:6: c:\mingw\bin\../lib/gcc/mingw32/4.5.0/include/c++/bits/unique_ptr.h: I n member function 'void __gnu_cxx::new_allocator<_Tp>::construct(_Tp*, const _Tp&) [with _Tp […]
好的,所以最后一次我写C ++为生, std::auto_ptr是所有的std lib都可用的,而boost::shared_ptr是所有的愤怒。 我从来没有真正看过其他提供的智能指针types提升。 我明白,C ++ 11现在提供了一些types的提升,但不是全部。 那么有人有一个简单的algorithm来确定何时使用哪个智能指针? 优选地包括关于哑指针(诸如T*原始指针)和其余的升压智能指针的build议。 (这样的事情会很棒)。
在C ++实践中,什么是RAII ,什么是智能指针 ,它们是如何在程序中实现的,以及使用RAII和智能指针有什么好处?
什么是智能指针,什么时候该用?