使用对象创建 shared_ptr 的数组

Create a array of shared_ptr with objects

我刚开始使用智能指针,我正在尝试创建它,但我遇到了错误。

    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')|

我该怎么做?

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

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

如果您使用 C++17,还可以使用 operator[]

但是,您遇到了另一个问题(因此 operator[] 无法正常工作)。您正在将 new[] 的结果存储在 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 较慢。