2010-06-01 3 views
3

auto_ptr을 사용하여 동적으로 할당 된 배열에 대한 포인터를 보유하고있는 경우 auto_ptr이 종료되면 작업이 삭제되고 delete []이 아니라 할당 된 배열이 삭제됩니다.동적으로 할당 된 배열에 auto_ptr을 사용하는 올바른 방법은 무엇입니까?

동적 할당 배열에서 auto_ptr을 (올바르게) 사용할 수 있습니까?

만약 이것이 가능하지 않다면, 동적으로 할당 된 배열을위한 다른 스마트 포인터 대안이 있습니까?

미리 감사드립니다.

답변

5

boost::shared_array 무엇을 찾고 계십니까?

편집 :

당신은 단지 그들이 배열의 아래에있는 메모리 할당에 대해 걱정할 필요가 없습니다 std::vector를 사용하여 내가 추천 부스트의 사용을 피하고 싶은 경우

. 실제로 이것은 shared_array보다 나은 해결책입니다.

auto_ptr을 사용하고자 함을 나타 내기 때문에 참조 계산 및 소유권 모델 shared_array이 필요하지 않습니다. 그래서 그들은 auto_ptr을 사용하여 실제로 관리하려고하는 동적으로 할당 된 배열을 대체하기 위해 맞춤형이므로 std::vector을 사용하십시오.

+0

부스트 사용을 피할 수 있습니까? – LoudNPossiblyWrong

1

직접 부스트를 사용하지 않으려면 먼저 동적 배열을 클래스로 래핑하십시오. 클래스의 소멸자에게 delete[]을 호출하게하십시오. 그런 다음 auto_ptr<Wrapper>은 클래스에서 delete을 호출 할 수 있으며 메모리가 올바르게 할당 해제됩니다.

0

auto_ptr (동적으로 할당 된 배열 또는 다른 것과 함께)을 사용하는 올바른 방법은 대신 다른 것을 사용하는 것입니다. 귀하의 경우에는 TR1에서 boost :: shared_array 또는 shared_ptr> 또는 shared_ptr>을 사용하십시오. 일반적인 경우 shared_ptr 또는 unique_ptr은 실제로 똑똑한 스마트 포인터입니다. auto_ptr 사용을 중지하십시오.

+0

그건 사실이 아닙니다. auto_ptr에는 유효한 유스 케이스가 있습니다.틀림없이 초보자가 이해하기는 쉽지 않지만 사용해서는 안되는 담요는 평범한 나쁜 조언 일뿐입니다. –

+1

shared_ptr 및 unique_ptr을 가지고 있다면이 컨테이너에서 auto_ptr이 안전 할 것인지를 결정할 수 있습니다. 사용하는 것에 대해 신중하게 생각해야하는 도구는 더 나은 옵션을 얻을 때 행복하게 버리는 도구입니다. shared_ptr 및 unique_ptr이 더 나은 옵션입니다. –

10

그렇지 않습니다. std::auto_ptr은 배열과 함께 사용되지 않습니다.

new[]delete[]을 사용하지 마십시오. 대신 std::vector을 사용하십시오. This is Stroustrup's recommendation too.

포인터를 필요로하는 코드에 전달해야하므로 배열을 사용하는 경우 (비어 있지 않은) 벡터의 첫 번째 요소 주소를 전달하면됩니다. 예를 들어 :

std::vector<char> buf(size); 
fgets(&buf[0], buf.size(), stdin); 

C++ 11에, 당신은 (그리고해야한다) buf.data() 대신 &buf[0] 사용하는 것으로, buf.data()도 빈 벡터에서 작동합니다.

1

std::auto_ptr이 유일한 소유 포인터이기 때문에이 경우 적절한 부스트 스마트 포인터는 boost::scoped_array입니다. 더 유명한 boost :: shared_array가 아닙니다. 과 반대로은 공유 소유권 포인터입니다. C++ 0x에서 올바른 포인터는 std::unique_ptr입니다.이 포인터는 배열을 가리키는 경우 delete []를 호출하고 단일 객체를 가리키는 경우 삭제합니다.

관련 문제