Questions tagged «smart-pointers»

一种抽象的数据类型,它在提供其他功能(例如自动垃圾收集或边界检查)的同时模拟指针



4
何时使用哪种指针?
好的,所以我上一次写C ++为生时,std::auto_ptr所有的std lib都可用,而且boost::shared_ptr风靡一时。我从来没有真正研究过提供的其他智能指针类型。我知道C ++ 11现在提供了某些类型的boost,但不是全部。 那么,有人可以通过简单的算法来确定何时使用哪个智能指针吗?最好包括有关哑指针(原始指针,如T*)和其他Boost智能指针的建议。(喜欢的东西这将是巨大的)。

4
智能指针(提升)说明
以下一组指针有什么区别?何时在生产代码中使用每个指针(如果有的话)? 例子将不胜感激! scoped_ptr shared_ptr weak_ptr intrusive_ptr 您是否在生产代码中使用boost?

2
为什么不能将unique_ptr推回向量中?
该程序有什么问题? #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; } 错误: 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: In member function 'void __gnu_cxx::new_allocator<_Tp>::construct(_Tp*, const _Tp&) [with _Tp = std::unique_ptr<int>, _Tp* …


4
std :: auto_ptr到std :: unique_ptr
随着新标准的到来(以及某些编译器中已有的部件),新类型std::unique_ptr应被替换为std::auto_ptr。 它们的用法是否完全重叠(因此我可以在我的代码上进行全局查找/替换(不是我可以这样做,但是如果可以的话))还是应该注意阅读文档后看不到的一些区别? 另外,如果它是直接替代品,为什么给它起一个新的名字而不是仅仅改善它std::auto_ptr?

2
为班级成员使用智能指针
我在理解智能指针在C ++ 11中作为类成员的用法时遇到了麻烦。我已经阅读了很多关于智能指针,我想我不知道如何unique_ptr和shared_ptr/ weak_ptr做工一般。我不明白的是真正的用法。似乎每个人都建议将其unique_ptr作为几乎所有时间都使用的方式。但是我将如何实现这样的事情: class Device { }; class Settings { Device *device; public: Settings(Device *device) { this->device = device; } Device *getDevice() { return device; } }; int main() { Device *device = new Device(); Settings settings(device); // ... Device *myDevice = settings.getDevice(); // do something with myDevice... } …

8
为什么C ++库和框架从不使用智能指针?
我读过几篇文章,几乎不应该使用原始指针。相反,它们应始终包装在智能指针中,无论是作用域指针还是共享指针。 但是,我注意到Qt,wxWidgets之类的框架以及Boost之类的库从不返回也不期望有智能指针,就好像它们根本没有使用它们一样。相反,它们返回或期望原始指针。有什么理由吗?编写公共API时,我应该远离智能指针吗?为什么? 只是想知道为什么在许多大型项目似乎都避免使用智能指针的情况下建议使用智能指针。

6
我为什么要std :: move一个std :: shared_ptr?
我一直在浏览Clang源代码,发现以下代码段: void CompilerInstance::setInvocation( std::shared_ptr<CompilerInvocation> Value) { Invocation = std::move(Value); } 我为什么要std::move一个std::shared_ptr? 在共享资源上转移所有权有什么意义吗? 我为什么不这样做呢? void CompilerInstance::setInvocation( std::shared_ptr<CompilerInvocation> Value) { Invocation = Value; }


3
有哪些C ++智能指针实现?
比较,优点,缺点以及何时使用? 这是从垃圾回收线程中衍生出来的中,我认为这是一个简单的答案,它生成了一些有关某些特定智能指针实现的评论,因此似乎值得开始新文章。 最终的问题是,C ++中智能指针的各种实现方式是什么,它们如何进行比较?只是简单的利弊或异常,否则您可能会认为应该起作用。 我已经发布了一些我已经使用或至少被掩盖并考虑使用的实现作为以下答案,并且我了解它们的差异和相似性可能不是100%准确的,因此可以根据需要随时进行事实检查或纠正。 目的是学习一些新的对象和库,或者更正我的用法以及对已经广泛使用的现有实现的理解,并最终为其他人提供不错的参考。

11
智能指针:谁拥有对象?[关闭]
很难说出这里的要求。这个问题是模棱两可,含糊不清,不完整,过于宽泛或夸张的,不能以目前的形式合理地回答。如需帮助澄清此问题以便可以重新打开, 请访问帮助中心。 8年前关闭。 C ++全部关于内存所有权(也称为所有权语义)。 动态分配的内存块的所有者负责释放该内存。因此,问题实际上变成了谁拥有记忆。 在C ++所有权中,原始指针被包装在其中,因此在一个良好的(IMO)C ++程序中,很少会看到原始指针传递(很少,不是永远不会)(因为原始指针没有推断出的所有权,因此我们可以不知道谁是内存的所有者,因此,如果不仔细阅读文档,就无法知道谁对内存负责。 相反,很少看到原始指针存储在类中,每个原始指针都存储在其自己的智能指针包装器中。(注意:如果您不拥有对象,则不应存储该对象,因为您不知道该对象何时会超出范围并被破坏。) 所以问题是: 人们遇到过哪种所有权语义? 哪些标准类用于实现这些语义? 您觉得它们在什么情况下有用? 让我们为每个答案保留一种类型的语义所有权,以便可以分别对它们进行表决。 摘要: 从概念上讲,智能指针很简单,简单的实现也很容易。我已经看到了许多尝试的实现,但是它们总是以某种偶然使用和示例不明显的方式被破坏。因此,我建议始终使用库中经过良好测试的智能指针,而不要自己动手。std::auto_ptr或Boost智能指针之一似乎可以满足我的所有需求。 std::auto_ptr<T>: 一个人拥有该对象。允许转让所有权。 用法:这允许您定义显示显式所有权转移的接口。 boost::scoped_ptr<T> 一个人拥有该对象。不允许转让所有权。 用法:用于显示明确的所有权。对象将由析构函数或明确重置后销毁。 boost::shared_ptr<T>(std::tr1::shared_ptr<T>) 多重所有权。这是一个简单的引用计数指针。当引用计数达到零时,对象将被销毁。 用法:一个对象可以具有多个编译器,且其生存期在编译时无法确定。 boost::weak_ptr<T>: 用于shared_ptr<T>可能发生指针循环的情况。 用法:仅当循环维护共享引用计数时,用于停止保留对象的循环。

4
shared_ptr在哪里?
几个小时后试图找到shared_ptr的位置后,我现在感到非常沮丧。我看到的所有示例都没有显示完整的代码来包含shared_ptr(和正在运行的)标题。简单的声明std,tr1并<memory>在一切都没有帮助!我已经下载了增强功能,但仍然没有显示!有人可以告诉我在哪里可以找到我吗? 感谢您让我发泄挫败感! 编辑:我看到我的标题已更改。对于那个很抱歉。所以...这也是因为我不清楚shared_ptr是否“依赖C ++版本”->这就是为什么我没有声明我的环境->因此可能为什么我很难找到它。 我正在使用MSVS2008。 编辑2:我不知道为什么,但是当我到处寻找shared_ptr时,我包括了[memory]和[boost / tr1 / memory.hpp]和[boost / tr1 / tr1 / memory]。没错 感谢您的所有回复。

5
与C ++中的普通指针相比,智能指针的开销是多少?
与C ++ 11中的普通指针相比,智能指针的开销是多少?换句话说,如果我使用智能指针,我的代码会变慢吗?如果这样,速度会慢多少? 具体来说,我在问C ++ 11 std::shared_ptr和std::unique_ptr。 显然,被压入堆栈的东西会更大(至少我认为是这样),因为智能指针还需要存储其内部状态(引用计数等),所以问题的实质是,这将要花费多少呢?会影响我的表现吗? 例如,我从函数而不是普通指针返回智能指针: std::shared_ptr<const Value> getValue(); // versus const Value *getValue(); 或者,例如,当我的函数之一接受智能指针作为参数而不是普通指针时: void setValue(std::shared_ptr<const Value> val); // versus void setValue(const Value *val);

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.