【问题标题】:TR1 Shared ArraysTR1 共享数组
【发布时间】:2010-10-12 06:36:17
【问题描述】:

我很难在 TR1 文档中找到有关共享数组的参考资料。 Boost 文档非常清楚 C++“new”和“new[]”表达式之间存在显着差异。 shared_ptr 模板旨在正确保存指向使用“new”创建的动态分配对象的指针。 shared_array 模板旨在使用“new[]”正确保存指向动态分配数组的指针。

我正在更新一些代码以使用 TR1 shared_ptr 模板和相关函数,但我发现没有提到 shared_array。 TR1 shared_ptr 实现是否区分“new”和“new[]”,并正确销毁这些指针?据我从 TR1 规范中可以看出,它似乎没有。如果是这种情况,我是否仍应将 boost shared_array 模板用于“new[]”样式分配?

【问题讨论】:

    标签: c++ boost tr1


    【解决方案1】:

    没错,TR1中没有shared_array。

    但是,如果您希望使用此构造函数,您可以提供自己的删除器对象来执行“删除 []”:

    template<class Other, class D>
       shared_ptr(Other* ptr, D dtor);
    

    例如:

    template<typename T>
    struct my_array_deleter
    {
       void operator()(T* p)
       {
          delete [] p;
       }
    };
    
    shared_ptr<int> sp(new int[100], my_array_deleter<int>());
    

    【讨论】:

    • 这表面上看起来不错,但是shared_ptr是否提供了operator[]?我认为 boost 不会。
    • TR1 shared_ptr 没有。你总是可以“int* p = sp.get(); p[5] = 42;”你确定你需要 shared_array 吗?向量或字符串通常就足够了。
    • 但是如果 sp 声明为 shared_ptr&lt;int&gt; 那么你会得到()不是 int*,而是 int?
    • @Yola - 我不确定我是否理解你的问题。 sp.get() 返回 sp 管理的底层原始指针。
    • @Brian Neal,对不起,我对 get() 和取消引用感到困惑 - *sp。 +1
    【解决方案2】:

    我怀疑大多数使用TR1的人不使用数组,而是使用vector。

    TR1我没看过,所以在Boost的基础上回答,大概够用了。 boost::shared_ptr 处理单个对象,而不是数组。这就是 boost::shared_array 的用途。

    如果您使用数组,并且有理由转换为 shared_array 而不是 vector,请使用 shared_array。

    【讨论】:

    • 但即使 boost::shared_ptr 也可以使用自定义删除器进行实例化,该删除器可以执行“删除 []”。我相信这就是 TR1 没有采用 boost::shared_array 的原因。
    • 嗯,c++1x 也没有采用 shared_array。我不知道为什么。但是,它们有一个 unique_ptr。如果你使用 unique_ptr,那么它使用 delete[] 来释放。我不知道为什么他们也不为 shared_ptr 提供它们。像 shared_ptr .
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-11
    相关资源
    最近更新 更多