【问题标题】:smart pointer in the std::mapstd::map 中的智能指针
【发布时间】:2013-02-20 11:03:00
【问题描述】:

我已经定义了一个类myClass,它的一个数据成员是

std::map<int,data*> dataMap

数据定义为

struct data
{
    int d1;
    int d2;
    std::string d3;
}

向dataMap插入数据如下:dataMap[key] = new data; 以下分配会导致问题:

myClass a1,a2;
//init a1;
a2 = a1;

我想将 auto_ptr 用于数据而不是数据*。我该怎么做?- 因为在a2被破坏后破坏“a1数据的坏指针”存在问题。std::map&lt;int,std::auto_ptr&lt;data&gt; &gt;编译有问题

Upd 正如你所建议的,我使用 std::shared_ptr 但它仍然会导致问题: 在VS10

error C2440: 'delete' : cannot convert from 'std::tr1::shared_ptr<_Ty>' to 'void *'
1>          with
1>          [
1>              _Ty=data
1>          ]

您能否编写示例代码来指出正确使用 shared_ptr 的方法

【问题讨论】:

  • 你使用的是 C++03 还是 C++11?
  • 不要使用auto_ptr,如果你可以访问c++11,请使用std::unique_ptrstd::shared_ptr,否则回退到使用boost::shared_ptr

标签: c++ map smart-pointers assign auto-ptr


【解决方案1】:

一般来说,使用auto_ptr 是一个坏主意(已弃用),甚至更糟糕的是when combined with standard containers

更喜欢设计更好的std::shared_ptrstd::unique_ptr (depending on your situation),您的代码将在一个例外情况下工作:您需要在尝试将其插入容器时构造正确的智能指针类型,作为智能指针不能从原始指针隐式构造。

【讨论】:

    【解决方案2】:

    对于这个错误:
    error C2440: 'delete' : cannot convert from 'std::tr1::shared_ptr&lt;_Ty&gt;' to 'void *'
    您不需要删除 shared_ptr 的瞬间。 shared_ptr 将使用引用计数器保存资源(new data),并在引用计数器为 0 时自动将其删除,这意味着该资源根本没有被使用。详情见manual of shared_ptr

    【讨论】:

      【解决方案3】:

      std::auto_ptr 在容器中使用是不安全的,这就是它被弃用的原因。如果可用,请使用std::shared_ptrboost::shared_ptr

      如果合适且可用,您也可以使用std::unique_ptr,但这有点棘手。

      【讨论】:

        【解决方案4】:

        如果你有唯一的所有权,你可以在 C++11 中使用std::unique_ptr(即,对象永远不会被共享,只有创建者可以再次销毁它),或者你可以使用std::shared_ptr,如果你有共享所有权。

        如果您使用的是 C++03,则可以改用 boost::shared_ptrboost::unique_ptr

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-04-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-10-09
          相关资源
          最近更新 更多