【问题标题】:Does C++11 have wrappers for dynamically-allocated arrays like Boost's scoped_array?C++11 是否有动态分配数组的包装器,如 Boost 的 scoped_array?
【发布时间】:2012-01-27 06:59:12
【问题描述】:

我经常需要在 C++ 中处理动态分配的数组,因此依赖 Boost 来处理 scoped_array、shared_array 等。在阅读了Stroustrup's C++11 FAQC++11 Reference Wiki 之后,我找不到合适的替代品来替代C++11 标准提供的这些动态数组包装器。有什么是我忽略的,还是我必须继续依赖 Boost?

【问题讨论】:

    标签: c++11 memory-management boost wrapper smart-pointers


    【解决方案1】:

    unique_ptr 有一个特化,比如unique_ptr<T[]>

    #include <iostream>
    #include <memory>
    
    struct test
    {
      ~test() { std::cout << "test::dtor" << std::endl; }
    };
    
    int main()
    {
      std::unique_ptr<test[]> array(new test[3]);
    }
    

    当你运行它时,你会得到这个消息。

    test::dtor
    test::dtor
    test::dtor
    

    如果你想使用shared_ptr,你应该使用std::default_delete&lt;T[]&gt;作为删除器,因为它没有像shared_ptr&lt;t[]&gt;这样的。

    std::shared_ptr<test> array(new test[3], std::default_delete<test[]>());
    

    【讨论】:

    • 该专业还提供T&amp; operator[](size_t) 访问成员。
    【解决方案2】:

    就向量作为数组包装器而言,如果您使用任何合适的智能指针将向量作为内部对象会怎样?

    【讨论】:

    • 如果元素类型不可复制,vector::emplace_back() 和 vector::push_back() 将不起作用。我不知道使用初始化列表进行初始化,但我怀疑这有同样的问题。
    • 是的,你是对的,在这种情况下,我们需要用额外的包装器来包装这些不可复制的东西,这确实有点矫枉过正:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-06
    • 2014-05-15
    • 2014-08-19
    • 2013-06-27
    • 1970-01-01
    • 2016-04-01
    相关资源
    最近更新 更多