2017-11-02 5 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); 
} 

오류 : | 없음 일치 '연산자 +'(피연산자 유형은 '표준 : : shared_ptr의'와 'INT'입니다)

어떻게 할 수 있습니까?

답변

0

sp에 의해 관리되는 포인터 대신 isp에 추가하려고합니다. 당신이 원하는 것은 먼저 저장된 포인터를 얻을 수 get()을 사용할 수 있습니다 :

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

당신이 C++ (17)를 사용하는 경우, 또한 당신이 사용할 수 operator[]있다.

그러나 다른 문제가 있습니다 (그리고 이로 인해 operator[]이 작동하지 않습니다). 당신은 new에 의해 반환 된 포인터를 관리하기를 기대하는 std::shared_ptrnew[]의 결과를 저장하고 있습니다. sp 귀하의 구조는 실제로해야한다 :

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

그렇지 않으면 당신이 정의되지 않은 동작을 얻을 것이다, spnew 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은 느립니다.
관련 문제