【问题标题】:How to use smart pointer wrap an array? [duplicate]如何使用智能指针包装数组? [复制]
【发布时间】:2014-06-03 22:08:41
【问题描述】:

复制为shared_ptr to an array : should it be used?


根据this post,用 smart_ptr 包装数组的好方法是定义一个 deleter 函数并将 deleter 函数与原始数组一起单独传递给 smart_ptr。


我将重构我的代码,例如使用 smart_ptr 包装原始数组。 这是一个例子:

原始代码:

    class MyList{
    public:
       MyList(int size = 0);
       void Resize(int size);
       ~MyList();
    private:
       int* myArray; 
       int* head_;
       size_t size_;
    }

    MyList::MyList(int size){
        myArray = new int[size]; //allocated memory when object is being created 
        head_ = list_;
        size_ = size;
    }

    void MyList::Resize(int size) {
        if (!list_) {
             delete myArray;
             size_ = 0;
        }
        myArray = new int[size];
        head_ = list_;
        size_ = size;
    }

    MyList::~MyList(){
       delete myArray;
       head = null_ptr;
    }  

我的问题是: 如何使用smart_ptr 正确包装原始数组?

【问题讨论】:

  • 试试myArray = new myArraySize()
  • 我没听懂,你能告诉我更多细节吗?谢谢
  • 您必须使用new 运算符构建一个新实例,这意味着调用构造函数,即myArraySize(),而不是myArraySize。当然我假设myArraySize 是一个定义明确的class 类型。

标签: c++ pointers memory-management smart-pointers dynamic-memory-allocation


【解决方案1】:

不要使用shared_ptr 作为默认智能指针。

那是unique_ptrshared_ptr 对应于共享所有权。您需要唯一的所有权。

更多信息here


智能指针的重新分配

智能指针不能分配给原始指针。这是有充分理由的。

改为写

myArray = std::make_shared<int>( myArraySize );
// Creates ONE int-object, which is initialized to myArraySize

或者直接使用初始化列表:

myClass::myClass(int myArraySize) :
    myArray{ std::make_shared<int>(myArraySize) } {}

但是你想要一个数组!

首先,您应该使用std::size_t 来指定数组边界。

现在是设置正确智能指针并初始化它的实际代码:

std::unique_ptr<int[]> myArray;

// [...]

myClass::myClass(int myArraySize) :
    myArray{ new int[myArraySize]() } {}
    // value-initialized it

或者从 C++1y(或有自己的定义)到 make_unique

myClass::myClass(int myArraySize) :
    myArray{ std::make_unique<int[]>(myArraySize) } {}

【讨论】:

  • 我的错。尽管如此,使用make_shared 至少更有效,即使不是更正确......
  • @Deduplicator make_shared 如何更高效?它只是封装了调用。
  • @CharlesChow 你有没有读过我剩下的帖子!?
  • 将原始指针分配给共享指针而不给出引用的其他 shared_ptr 分配一个新的引用计数+删除对象。 make_shared 将此分配与有效负载分配相结合。
  • 这就是我所做的,std::unique_ptr myArray; myArray.reset(new int[10]);它工作正常,我刚刚将大小 10 重新分配给 myArray,我做错了什么吗?
猜你喜欢
  • 1970-01-01
  • 2016-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-06
  • 2022-12-16
  • 2016-01-24
  • 2016-10-09
相关资源
最近更新 更多