2013-09-01 2 views
-2

나는C++ 11의 배열로 의미를 옮길 수 있습니까?

#include <iostream> 
#include <memory> 
using namespace std; 

class A 
{ 
public: 
    virtual ~A() {} 
    virtual void print() 
    { 
      cout << "A::Print()" << endl; 
    } 
}; 

class B : public A 
{ 
public: 
    virtual ~B() {} 
    virtual void print() 
    { 
      cout << "B::Print()" << endl; 
    } 
}; 


int main() 
{ 
    A a; 
    B b; 

    A* arr[2] = {&a, &b}; 
    arr[0]->print(); 
    arr[1]->print(); 

    unique_ptr<A*[]> ptr(move(arr)); 
    /* 
    unique_ptr<A*[]> ptr(new A*[2]{&a, &b}); 
    */ 
    ptr[0]->print(); 
    ptr[1]->print(); 

    return 0; 
} 

그것은

A::Print() 
B::Print() 
A::Print() 
B::Print() 
Aborted (core dumped) 

는 그것은 ptrarr samething을 가리킨 때 호출 처럼 보일 (g ++ 4.7.3)과 같은 결과를 얻을 수에 따라 같은 unique_ptr <>을 테스트 소멸자, 그것은 두 번 삭제되었습니다.

왜 여기에 이동 의미가 적용되지 않습니까?

배열에 맞지 않거나 unique_ptr에 관한 것입니까?

+0

을 달성하기 위해 노력하고 무엇을 말할 수있는 테스트로이 만들어 추측하고있어 C 스타일 배열의 std::array<A,2>, 그는 기술적으로 먼저 대답했다 :) – aaronman

답변

3

여기서 문제는 동적으로 할당 된 메모리가 없다는 것입니다 (new 키워드를 사용하지 마십시오). 따라서 unique_ptr은 할당되지 않은 메모리를 해제하려고합니다 (call delete on). 제 제안은보다 단순한 코드를 작성하는 것입니다. 왜냐하면 여러분은 매우 틀에 박히지 않는 많은 일을하기 때문입니다. 당신은 아무 이유없이 A* 저장

  1. , 그들은 내가
  2. 당신은 어떤 표준 라이브러리 컨테이너를 사용하지 않는 포인터로 저장할 수있는 어떤 좋은 이유를 생각할 수 없다, 자동으로 삭제 될 것입니다, 당신은을 사용할 수 있습니다 대신
  3. 은 또한 당신이 너무 난 정말 당신이 여기
  4. 다른 사람이 적어도 UV 가치가
+0

예. 나는 그것을 안다. 고맙다! – CLS

+0

@CLS 것들이 더 잘 작동하고 STL을 사용할 때 좋게 보입니다. – aaronman

+0

무슨 뜻인지 모르겠어요 ... STL을 읽었을 때 unique_ptr에 대한 테스트를 했으니까요. 'new '로 할당되지 않은 객체는 정의되지 않은 동작이므로, 나는 의미 상으로는 의미 이동이 문제가 될 수 있다고 생각합니다. – CLS

4

여기서 문제는 unique_ptr<T>은 관리하는 개체가 new으로 할당되었다고 가정합니다. 대신 스택에 정적으로 할당되기 때문에 소멸자는 배열 delete을 시도 할 때 충돌합니다.

어쨌든이 unique_ptr으로 무엇을 달성하려고하는지 잘 모르겠습니다. 고유 포인터는 관리 대상 객체가 범위 끝에서 삭제되지만 스택에 할당 된 배열 은 범위 끝에서 본질적으로 삭제 된임을 확인합니다. unique_ptr이 없으면 코드가 동일하게 작동하고 누수가 작동하지 않을 것입니다.

관련 문제