2013-01-17 2 views
0

이 같은 힙에 INT의 벡터 만드는거야 :힙의 int의 벡터 및 해제 메모리

std::vector<int> vec = *new std::vector<int>();

다음 내 프로그램의 마지막에 도착하고 난 메모리를 해제 할 필요를 , vec.clear()을 사용하면 메모리가 해제되지 않습니다.

어떻게하면 제대로 할 수 있습니까?

감사와 -Mitchell

+2

'* 어 new', 왜 이러는거야? – GManNickG

+0

새 항목마다 삭제가 필요하므로 vec를 삭제하십시오. –

+0

@brianbeuning :'vec'은 포인터가 아니며'new'가 아닙니다. – GManNickG

답변

4

어떻게 적절하게이 작업을 수행 할 최고의 모든?

이 장착 :이

std::vector<int> vec = *new std::vector<int>(); 

을 :

std::vector<int> vec; 

과제를 해결한다.

대부분의 상황에서 new은 가장 많이 피할 수있는 언어입니다. 다른 언어와 마찬가지로 객체를 동적으로 할당합니다. 그러나 다른 언어와 달리 C++에는 가비지 컬렉터가 없으므로 동적으로 할당하는 객체를 수동으로 삭제해야합니다. 그러나 코드를 작성한 방법으로는 불가능합니다.

개체를 동적으로 할당하면 개체에 대한 포인터를 반환하는 new가 동적으로 할당됩니다. 그런 다음 포인터를 역 참조 (*를 통해)하고 객체를 vec에 복사합니다. vec이 제대로 소멸되지만 복사 된 동적으로 할당 된 개체는 복사되지 않습니다. 그리고 포인터를 저장하지 않았으므로 그 객체에 액세스 할 수있는 방법이없고 그 객체를 처리 할 방법이 없습니다.

delete vec_pointer; 
:

나중에 그런
std::vector<int>* vec_pointer = new std::vector<int>(); 

, 개체를 파괴하고 포인터에 삭제 부를 수있는 메모리 할당을 해제 : 해당 객체를 파괴하기 위해이 같은 포인터를 포착했을 것이다

다행히도 동적 할당은 다른 언어 에서처럼 자주 필요하지 않습니다. 객체를 선언하면 객체가 생성되고 범위를 벗어나면 객체가 파괴됩니다. 그래서 당신이 보여준 간단한 코드 라인만으로도 충분합니다. 삭제 명령이 필요 없습니다.

어떤 이유에서든 동적 할당이 필요하다고 결정한 경우 추가 참고 사항으로 스마트 포인터 (Google)를 사용하십시오.

+0

그게 완벽 했어, 내가 한 짓이 왜 틀린 지 설명 할 수 있니? – Mitchell

+1

@Mitchell : 동적으로 벡터를 할당하고, 포인터 값을 역 참조하고, vec에 복사 한 다음, 누설 된 할당 메모리에 대한 참조를 잃어 버렸습니다. – GManNickG

2

프로그램이 메모리를 새고 있습니다.

std::vector<int> vec은 스택에서 벡터를 선언합니다. 힙에 두 번째 (비어있는) 벡터를 만들고이를 사용하여 스택의 복사본을 복사 생성합니다. 비어 있기 때문에 효과적이지 않습니다.

그러나 힙에 생성 된 벡터에 대한 포인터는 잃어 버렸습니다 (저장하지 않았기 때문에). 따라서 삭제할 수 없으며 해당 메모리를 다시 사용할 수 없습니다. 그러나 스택의 벡터는 자체적으로 정상적으로 정리됩니다.

은 당신이 아마 원하는 것은 단지입니다 :

std::vector<int> vec; // Vector on stack, no manual memory management required 

당신이 정말로 (스택이 빠르고, 및 벡터 개체 자체가 얼마나 많은 요소에 관계없이 고정 사이즈의 소형이며 어떤 이유로 힙을 사용하려면 당신이 스택 오버 플로우에 대해 걱정할 필요가 없습니다 있도록), 그 안에 넣어, 당신은 할 수 있습니다 :

// Declare pointer to vector, and initialize it with a new vector on the heap 
std::vector<int>* vec = new std::vector<int>(); 

심지어를 (C++ 11) :

auto vec = new std::vector<int>(); 

은 그런 때 당신은 그것으로 완료 :

delete vec;