2011-12-23 3 views
0

저는 C++를 배웠고 벡터에 혼란을 느끼고 있습니다. 특히 정적 벡터가 동적 배열을 내부적으로 구현하는 경우 프로그램이 끝나면 동적 배열에서 사용하는 스택 메모리가 해제 되나요? 아니면 삭제 작업을 사용해야합니까? 그렇지 않으면 정적 벡터에서 소멸자를 호출해야합니까?정적 벡터를 삭제해야합니까?

+1

로컬 변수가 범위를 벗어나면 소멸자가 자동으로 호출됩니다. 'std :: vector'의 소멸자는 존재하는 동안 로컬'std :: vector' 객체에 의해 내부적으로 할당 된 동적 메모리를 해제합니다. 전역 객체의 소멸자는 프로그램이 종료되기 전에 마찬가지로 호출됩니다. – lapk

+2

"정적 벡터"의 코드 예제를 제공하십시오. '정적'은 C++에서 많은 것을 의미합니다. –

답변

-1

모든 메모리는 프로그램 종료시에 릴리스됩니다.

1

벡터에는 내부 메모리 관리 기능이 있습니다. 즉, 생성자 (생성자에서)와 필요할 때 필요한 추가 메모리를 필요로한다고 생각하는 것을 할당합니다.

벡터가 파괴되면 (범위를 벗어나거나 프로그램이 종료되거나 수동으로 삭제되는 경우) 내부적으로 할당 된 모든 메모리가 함께 삭제됩니다.

0

벡터의 소멸자는 프로그램이 종료되기 전에 호출됩니다.

벡터가 객체에 대한 포인터를 보유하고있는 경우 소멸자는 호출되지 않지만 대부분의 플랫폼에서는 프로그램에 의해 할당 된 모든 메모리가 프로그램이 종료 될 때 해제됩니다. 당신이 그것을에 new, 다음 결코 전화 delete를 사용하여 문제의 일을 할당하지 않은 경우

3

나는 삭제 작업을

를 사용해야합니다.

또는 정적 벡터에서 소멸자를 호출 하시겠습니까? 당신이하지 않은 경우

은 다음 대해 게재 위치 new결코 호출 명시 적으로 소멸자를 사용하여 현재 위치에서 일을 다시 초기화합니다.

은 (당신이 표준 라이브러리에 대한 표준 : : 벡터를 구현하는 사람이 아닌 경우에, 당신은 지금, new에게 자신을 대해 게재 위치 사용할 필요가 없습니다 거의 확실하다.)

전역 변수가 정리하세요 프로그램 종료시 자동으로

0

정적 벡터의 의미를 잘 모르겠습니다. std :: vector는 크기 조정 가능한 배열을 관리하는 STL 컨테이너입니다 (http://www.cplusplus.com/reference/stl/vector/ 참조). 전역 컨텍스트에서 정적은 심볼을 포함 된 컴파일 유닛 외부에서 볼 수 없도록 local 파일을 의미합니다. 클래스 컨텍스트에서 static은 대부분 클래스 유형과 관련된 전역 변수를 만드는 네임 스페이스의 트릭입니다 (클래스 인스턴스와 반대 됨).

std :: vector가 정적인지 여부는 구현 방법과 아무 관계가 없습니다. 모든 std :: vector 인스턴스는 동적으로 할당 된 T의 연속 배열을 할당하고 유지합니다. vector의 소멸자는 이전에 할당 한 T의 배열을 삭제합니다. 당신은이 메모리를 할당하거나 해제 할 필요가 없으며, 심지어 그것이 일어나고 있음을 알 수도 있습니다. std :: vector 인스턴스가 정적 인 경우 main()이 종료 된 후에 소멸자가 호출됩니다. 스택에 할당 된 경우 소멸자는 범위를 벗어날 때 호출됩니다.당신이

std::vector<T>* p = new std::vector<T>(); 

를 호출하는 경우는 p가 범위를 벗어나 전에

delete p; 

를 호출 할 책임이 있습니다.

마지막으로 벡터 자체에 동적으로 할당 된 포인터가 포함되어있는 경우 해당 포인터도 삭제해야합니다.

// Not exception safe code! 
std::vector<int*> v; 
v.push_back(new int(4)); 
v.push_back(new int(5)); 
std::cout << *v[0] << ", " << *v[1] << std::endl; 
for (auto iter = v.begin(); iter != v.end(); ++iter) { 
    delete *iter; 
} 
v.clear(); 

C/C에서 엄지 손가락의 좋은 규칙 ++입니다 :

즉, 새로운, 당신은 또한 삭제한다.

벡터에서 사용한 배열을 새로 작성하지 않으므로 삭제할 필요가 없습니다.

+0

는'당신은 well.'로 그 삭제에 대한 책임을 져야합니다 -> 제안 추가 : 것을 만들기위한 망할 것은 예외 안전 ...) –

+0

도니는 다르게 .. 나는 상점 동적으로 포인터를 할당 내 예제 코드가되는 것은 아니다해야 좋은 디자인입니다. 단지 new'd 메모리를 저장하면 v.clear()를 호출 할 때 vector 클래스가 delete를 호출하지 않을 것이라는 점을 보여줍니다. –