2013-08-22 2 views
4

나는 여러 파생 클래스에 의해 상속되는 기본 클래스를가집니다. 내가 baseClass 포인터 autopointer 배열을 만들고 싶습니다. 나는 약간의 컴파일 시간 오류가 autopointer 사람들을 초기화 할 때 메신저 하나의 창, 내가 Valgrind의 사용하지 않는 동안, 그럼 난, 잘 작동auto_ptr 배열을 만들 수 있습니까?

std::auto_ptr<base>pbase[3]; 

std::auto_ptr<base> b1(new derived1()); 
std::auto_ptr<base> b2(new derived2()); 
std::suto_ptr<base> b3(new derived3()); 

pbase[0] = b1; 
pbase[1] = b2; 
pbase[2] = b3; 

, 난 메모리 누수 문제를 해결하는 방법처럼하려고 노력 나는 누출을위한 부스트 프레임 워크를 사용한다. 컴파일 오류

: A.cpp의

class A{ 
public: 
    std::auto_ptr<base>pbase[2]; 
} 

A::A():pbase[0](new derived1()), pbase[1](new derived2()){ 
} 

내가 오류 C2059:syntax error : '['

+4

오류 메시지도 함께 게시하십시오. – arne

+6

가상 소멸자가 있습니까? 또한 auto_ptr 대신 unique_ptr 및 shared_ptr을 사용하십시오. 포인터를 저장하기 위해 std :: vector 사용에 대해 생각해보십시오. –

+8

'auto_ptr'은 이상한 복사 동작으로 인해 사용되지 않습니다. 'std :: unique_ptr'로 전환하는 것을 고려하십시오. – nijansen

답변

7

std::auto_ptr는 C++ 11 이후 사용되지 않으며있어와의 때문에, 사용하지 말아 파일 이상한 복사 동작 :

달성하려는 시도는 이제 std::unique_ptr으로 깨끗하게 해결됩니다. 이동 의미론과 rvalue 참조가 도입되기 전에는 이것이 불가능했습니다.

그러나 여기에는 문제가없는 것으로 보입니다. 사실

pbase[3] = b3; // pbase is std::auto_ptr<base>[3] 
       // pbase[0] - pbase[2] are valid indexes 

I fix that problem 그 결과에 valgrind --leak-check=full ./auto_ptr_app를 실행, 그것은 더 누설 할 수 없음을 알려줍니다 때 : 귀하의 예제에서 당신이 정의되지 않은 동작을 호출하기 때문에 메모리가 누수되는 것이 가능하다.

+0

정의되지 않은 동작의 일반적인 예는 정의되지 않은 동작을 호출하면 메모리 누수가 발생할 수 있습니다. –

+0

@MatthieuM. 정확하게. 이것이 내가 * 가능하다는 말을 선택한 이유입니다. - 무엇이든 가능합니다. – nijansen

+0

오타가 있습니다. [3], 편집했습니다. 그것을 가리키는 고맙습니다 – user1808932

1

나는 단지 다음 코드 조각이 Valgrind의 테스트를 실행했습니다 :

첫 방송 :

class Foo 
{ 
public: 
    Foo(){} 
    virtual ~Foo(){} 
}; 

class Bar: public Foo 
{ 
public: 
    Bar(){} 
    virtual ~Bar(){} 
}; 

int main(int argc, char** argv) 
{ 
    std::auto_ptr<Foo>arr[3]; 

    std::auto_ptr<Foo> one(new Bar()); 
    std::auto_ptr<Foo> two(new Bar()); 
    std::auto_ptr<Foo> three(new Bar()); 

    arr[0] = one; 
    arr[1] = two; 
    arr[2] = three; 
    return 0; 
} 

두 번째 실행 :

class Foo 
{ 
public: 
    Foo(){} 
    virtual ~Foo(){} 
}; 

class Bar: public Foo 
{ 
public: 
    Bar(){} 
    virtual ~Bar(){} 
}; 

int main(int argc, char** argv) 
{ 
    std::auto_ptr<Foo> one(new Bar()); 
    return 0; 
} 

Valgrind의 참으로 표시하는 동안 가능한 메모리 누수 두 경우 모두 표시되는 경고는 모두 이고 정확히입니다 (경고 수는 같고 경고 텍스트가 같고 스택이 같음). 그것들은 내 코드의 바깥 쪽을 linux .so 파일로 가리키고있다. 따라서 배열을 auto_ptr으로 사용하는 것이 좋습니다. 그러나 주석에 명시된 바와 같이 C++ 0x (현재 C++ 표준)이므로 auto_ptr은 이상한 복사 동작 (더 많은 정보를 찾을 수 있음, 예 : in this article) 때문에 사용되지 않는 것으로 간주됩니다. 대신 std::unique_ptr을 사용하는 것이 좋습니다.

이제 코드에 메모리 누수가 발생하면 자신의 클래스로 인해 발생할 수 있습니다. 불행히도, 당신은 질문에 그것들을 포함시키지 않았기 때문에 우리는 말할 수 없습니다. 이런 경우 클래스의 생성자와 소멸자가 메모리 누수가 있는지 확인하거나 최소한 클래스를 표시해야합니다. 또 다른 원인은 코드에있는 배열 색인의 오타 (pbase[3], 본드 제외) 일 수 있습니다. 즉 사용되지 않으며 (컴파일러는 C++ 11을 지원하지 않는 경우 boost::shared_ptr를 사용) 대신 unique_ptr 또는 shared_ptr를 사용해야하지만

+0

누수가 없으므로 문제가 해결되었습니다. 내 잘못입니다. :) – user1808932

1

귀하의 문제는 auto_ptr와 아마 아니다.누수가 클래스 구현 내에서 발생하는 것 같습니다. base에 가상 소멸자가 있는지 확인하십시오. 클래스를 다형 적으로 사용하려면 가상 소멸자가 필요합니다. 또한 기본 클래스와 파생 클래스의 멤버가 있는지 확인하고 할당 한 모든 것을 삭제하십시오.

관련 문제