【问题标题】:Create a array of shared_ptr with objects使用对象创建一个 shared_ptr 数组
【发布时间】:2018-04-14 13:27:58
【问题描述】:

我是使用智能指针的新手,我正在尝试创建相同的指针,但出现错误。

    class data{
private:
    int ID;
public:
    void setID(int a){
        ID=a;
    }
    int getID(){
        return ID;
    }};

   int main(){
    data d*;
    d=new data[30];
    for(int i=0;i<30;i++){
      (p+i)->setID(i);
   }}

我尝试:

shared_ptr<data> sp( new data[30]);
 for(int i=0;i<30;i++){
    sp->setID(i)[i];
}

错误:数组下标的无效类型 'void[int]'|

shared_ptr<data> sp( new data[30]);
for(int i=0;i<30;i++){
    (sp+i)->setID(i);
}

错误:“operator+”不匹配(操作数类型为“std::shared_ptr”和“int”)|

我该怎么做?

【问题讨论】:

    标签: arrays c++11 object shared-ptr


    【解决方案1】:

    问题是您尝试将i 添加到sp,而不是添加到由sp 管理的指针。您要做的是先使用get() 获取存储的指针:

    for (int i = 0; i < 30; i++) {
      sp.get()[i].setID(i);
    }
    

    如果你使用 C++17,还有 operator[] 可以使用。

    但是,您还有另一个问题(operator[] 将因此而无法工作)。您将new[] 的结果存储在std::shared_ptr 中,该std::shared_ptr 期望管理new 返回的指针。您对sp 的构造实际上应该是:

    std::shared_ptr<data[]> sp(new data[30]);
    

    否则你会得到未定义的行为,因为sp 将在new data[30] 返回的地址上调用delete,而它需要使用delete[]。这里有更多关于 std::shared_ptr 的构造函数的信息。

    旁注:

    1. 请为您的问题提供minimal, complete, and verifiable example。
    2. 您确定需要std::shared_ptr 吗? std::unique_ptr 不工作吗? std::unique_ptr 基本上与原始指针一样快,而 std::shared_ptr 则较慢。

    【讨论】:

      猜你喜欢
      • 2011-10-12
      • 2020-10-02
      • 2021-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-21
      相关资源
      最近更新 更多