2017-11-02 12 views
0

スマートポインタを初めて使用しています。同じものを作成しようとしていますが、エラーがあります。オブジェクトを持つshared_ptrの配列を作成します。

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

エラー:私はしてみてください

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); 
    }} 

無効なタイプの '空[INT]' 添字アレイ用|

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

エラー: 'operator +'(オペランドタイプは 'std :: shared_ptr'と 'int')に一致しません。

どうすれば同じことができますか?

答えて

0

spで管理されているポインタではなく、ispに追加しようとしています。何がやりたいことは最初に格納されているポインタを取得するためにget()を使用している:あなたがC++ 17を使用する場合は

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

、あなたが使用することができoperator[]もあります。

しかし、別の問題が発生しています(そのためにoperator[]が動作しません)。あなたはnewによって返されたポインタを管理することを期待するstd::shared_ptrnew[]の結果を格納しています。 spのあなたの建設は、実際には次のようになります。

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

spはそれがdelete[]を使用する必要があるのに対し、new data[30]によって返されたアドレスにdeleteを呼び出すために起こっているので、それ以外の場合あなたは、未定義の動作を取得します。ここには、std::shared_ptrのコンストラクタに関する詳細情報があります。

サイドノート:

  1. ご質問についてminimal, complete, and verifiable exampleを提供してください。
  2. std::shared_ptrが本当に必要ですか? std::unique_ptrは動作しませんか? std::unique_ptrは基本的に生ポインタと同じくらい速く、std::shared_ptrは遅いです。
関連する問題