标签: auto-ptr

208
推荐指数
5
解决办法
5万
查看次数

std :: auto_ptr到std :: unique_ptr

随着新标准的出现(以及某些编译器中已有的部件),新类型std::unique_ptr应该是替代品std::auto_ptr.

它们的用法是否完全重叠(因此我可以对我的代码进行全局查找/替换(不是我会这样做,但如果我这样做))或者我应该注意一些在阅读文档时不明显的差异?

此外,如果它是一个直接替代品(为什么给它一个新的名称),而不仅仅是改善std::auto_ptr.

c++ smart-pointers auto-ptr unique-ptr c++11

182
推荐指数
4
解决办法
6万
查看次数

为什么auto_ptr被弃用?

我听说auto_ptr在C++ 11中被弃用了.这是什么原因?

此外,我想知道的区别auto_ptrshared_ptr.

c++ smart-pointers auto-ptr c++11

84
推荐指数
5
解决办法
4万
查看次数

auto_ptr是否已被弃用?

  1. 在传入的C++标准中是否会弃用auto_ptr?
  2. unique_ptr应该用于所有权转移而不是shared_ptr吗?
  3. 如果unique_ptr不在标准中,那么我是否需要使用shared_ptr?

c++ standards smart-pointers auto-ptr unique-ptr

77
推荐指数
3
解决办法
4万
查看次数

那么unique_ptr可以在stl集合中安全使用吗?

我对unique_ptr和rvalue move哲学很困惑.

假设我们有两个集合:

std::vector<std::auto_ptr<int>> autoCollection;
std::vector<std::unique_ptr<int>> uniqueCollection;
Run Code Online (Sandbox Code Playgroud)

现在我希望以下内容失败,因为没有人知道算法在内部做了什么,也许还在制作内部数据透视副本等,从而剥夺了auto_ptr的所有权:

std::sort(autoCollection.begin(), autoCollection.end());
Run Code Online (Sandbox Code Playgroud)

我明白了 并且编译器正确地不允许这种情况发生.

但后来我这样做:

std::sort(uniqueCollection.begin(), uniqueCollection.end());
Run Code Online (Sandbox Code Playgroud)

这编译.我不明白为什么.我不认为unique_ptrs可以复制.这是否意味着不能采用枢轴值,因此排序效率较低?或者这个转轴实际上是一个移动,实际上和auto_ptrs的集合一样危险,编译器应该不允许这样做?

我想我错过了一些重要的信息,所以我急切等待有人给我提供啊哈!时刻.

c++ auto-ptr unique-ptr c++11

43
推荐指数
3
解决办法
2万
查看次数

为什么auto_ptr <T>没有定义运算符!()?

标题几乎总结了我的问题.为什么不能执行以下操作来检查空指针?

auto_ptr<char> p( some_expression );
// ...
if ( !p )  // error
Run Code Online (Sandbox Code Playgroud)

必须这样做:

if ( !p.get() ) // OK
Run Code Online (Sandbox Code Playgroud)

为什么auto_ptr<T>不简单operator!()定义?

c++ auto-ptr

20
推荐指数
3
解决办法
2431
查看次数

容器中的智能指针如std :: vector?

我正在学习有关智能指针(std::auto_ptr),只是看这里这里是智能指针(std::auto_ptr)不应该在容器(即放std::vector),因为即使大多数编译器不会抱怨,这似乎是正确的.没有规则说智能指针不会在内部复制(vector例如按类)并传输其所有权,然后指针将变为NULL.最后,一切都会搞砸.

实际上,这种情况多久发生一次?

有时我有指针的向量,如果在将来我决定我想要一个智能指针的矢量我会选择什么?

我知道C++ 0x和Boost库,但是现在,我更倾向于坚持使用STL方法.

c++ pointers smart-pointers std auto-ptr

19
推荐指数
2
解决办法
2万
查看次数

删除指向不完整类型和智能指针的指针

当尝试使用auto_ptr带有forward-declaration声明的类型时,如下所示:

class A;
...
std::auto_ptr<A> a;
Run Code Online (Sandbox Code Playgroud)

A没有调用析构函数(显然,因为auto_ptr内部delete的底层指针和不完整类型的析构函数不能被调用).

但是,相同的代码工作正常,并在使用时调用析构函数std::shared_ptr而不是std::auto_ptr.怎么解释?

c++ smart-pointers auto-ptr shared-ptr c++11

19
推荐指数
1
解决办法
6018
查看次数

std :: unique_ptr vs std :: shared_ptr vs std :: weak_ptr vs std :: auto_ptr vs raw pointer

与使用原始指针的类似(但不限于)某些高级技术相比,每个智能指针的等效用途是什么?

我的理解很少,但我可以收集到:

  • 原始指针:只有当你真的,真的,真的,真的,知道你正在做什么并且在界面后面仔细隐藏用法时才使用.
  • std :: auto_ptr:过时从不使用.
  • std :: unique_ptr:在赋值时转移所有权的Singleton指针.
  • std :: shared_ptr:引用计数指针,该指针在赋值时不转移所有权,但会增加其引用计数.当所有引用都离开范围或明确地调用std::shared_ptr::reset底层时deallocator.
  • std :: weak_ptr:std::shared_ptr不增加引用计数的子类型,当其父级std::shared_ptr不再存在时无效.可能会返回无效的引用.使用前请务必检查.

RAW指针等效示例

引用计数,缓存实现: std::map<std::string, std::pair<long, BITMAP*> > _cache;

拥有所有权的单身人士:

class Keyboard {
public:
//...
    static Keyboard* CreateKeyboard();
    ~Keyboard();
//...
private:
//...
    Keyboard();
    static Keyboard* _instance;
//...
};
Run Code Online (Sandbox Code Playgroud)

聚合容器,无所有权:空间分区图和树,迭代容器等.

复合容器,所有权:大型对象.

- 编辑 -

在我工作的时候,我遇到了一个有趣的案例,DeadMG指出智能指针应该被用作简单的抽象来处理资源管理; 那些在声明点无法在堆上创建但必须在以后创建的文件范围对象呢?

c++ auto-ptr shared-ptr weak-ptr unique-ptr

18
推荐指数
1
解决办法
9855
查看次数

你什么时候使用std :: auto_ptr而不是boost :: shared_ptr?

我们已经转移到使用boost::shared_ptr所有代码,但是我们仍然有一些我们使用的孤立案例std::auto_ptr,包括单例类:

template < typename TYPE >
class SharedSingleton
{
public: 
    static TYPE& Instance()
    {
        if (_ptrInstance.get() == NULL)
            _ptrInstance.reset(new TYPE);
        return *_ptrInstance;
    }

protected: 
    SharedSingleton() {};

private:
    static std::auto_ptr < TYPE > _ptrInstance;
};
Run Code Online (Sandbox Code Playgroud)

我被告知有一个很好的理由说明为什么没有这个shared_ptr,但对于我的生活,我不明白为什么?我知道auto_ptr最终会在下一个标准中被标记为折旧,所以我想知道我可以用什么/如何替换这个实现.

另外,你有没有其他原因考虑使用auto_ptr而不是shared_ptr你认为将来有什么问题转移到shared_ptr吗?


编辑:

  1. 所以,在回答"我能安全地更换auto_ptrshared_ptr在上面的代码",答案是肯定的-但我会带一个小的性能损失.
  2. auto_ptr最终标记为折旧并且我们转向时std::shared_ptr,我们需要彻底测试我们的代码以确保我们遵守不同的所有权语义.

c++ boost stl auto-ptr shared-ptr

17
推荐指数
2
解决办法
2万
查看次数