벡터가 할당되면 힙이나 스택에서 메모리를 사용합니까?


151

다음 내용이 모두 사실입니까?

vector<Type> vect; //allocates vect on stack and each of the Type (using std::allocator) also will be on the stack

vector<Type> *vect = new vector<Type>; //allocates vect on heap and each of the Type will be allocated on stack

vector<Type*> vect; //vect will be on stack and Type* will be on heap. 

어떻게 메모리는 내부적으로 할당 TypeA의 vector또는 다른 STL 컨테이너?


답변:


222
vector<Type> vect;

vector스택에, 즉 헤더 정보 를 할당 하지만 비어있는 저장소의 요소 ( "힙") 를 할당합니다 .

vector<Type> *vect = new vector<Type>;

무료 상점에 모든 것을 할당합니다.

vector<Type*> vect;

vector스택에 스택과 프리 포인터에 많은 포인터를 할당 하지만이 포인트는 사용 방법에 따라 결정됩니다 (예 : 요소 0을 프리 저장소로, 요소 1을 스택으로 가리킬 수 있음).


3
그러나 Type이 두 번째 선언에서 커질 때 세그멘테이션 오류가 발생하는 시나리오가 있습니다. Type이 스택에 할당 되었기 때문이라고 가정했습니다.
Phelodas

4
@Phelodas : 코드를 보지 않으면 평가할 수 없습니다. 새로운 질문을여십시오.
Fred Foo

2
정보 vector<Type> vect;요소가 힙에 있으며 헤더 정보가 헤더 정보가 함수 반환처럼, 메모리에서 제거 스택에 있기 때문에, 무슨 요소 메모리에 일어날 것인가? 헤더 정보로 회수됩니까? 그렇지 않은 경우 메모리 누수가 발생합니까?
flyrain

3
@flyrain : 벡터 자체가 정리됩니다. RAII를 읽으십시오 .
Fred Foo

1
@ flyrain : 작동해야합니다. 자세한 내용은 새 질문을 게시하십시오. 여기에 링크를 게시하면 살펴볼 수 있습니다.
Fred Foo

25
vector<Type> vect; //allocates vect on stack and each of the Type (using std::allocator) also will be on the stack

아니요, vect스택에 있지만 항목을 저장하기 위해 내부적으로 사용하는 배열은 힙에 있습니다. 항목은 해당 배열에 상주합니다.

vector<Type> *vect = new vector<Type>; //allocates vect on heap and each of the Type will be allocated on stack

아니요. vector클래스가 힙에 있다는 점을 제외하면 위와 동일 합니다.

vector<Type*> vect; //vect will be on stack and Type* will be on heap. 

vect스택에 있고 해당 항목 (포인터 Type)이 힙에 있으며 Type포인터가 가리키는 위치를 알 수 없습니다 . 스택에있을 수도 있고, 힙에있을 수도 있고, 전역 데이터에있을 수도 있고, 어디에도 없을 수도 있습니다 (예 :NULL 포인터).

BTW 구현은 실제로 스택에 일부 벡터 (일반적으로 작은 크기)를 완전히 저장할 수 있습니다. 그런 구현에 대해서는 아는 것이 없지만 가능합니다.


23

실제로 스택과 힙이있는 구현 (표준 C ++은 그러한 것을 요구하지 않음)을 가정하면 유일한 유일한 진술은 마지막 진술입니다.

vector<Type> vect;
//allocates vect on stack and each of the Type (using std::allocator) also will be on the stack

마지막 부분을 제외하고는 마찬가지입니다 ( Type스택에 있지 않음). 상상해보십시오.

  void foo(vector<Type>& vec) {
     // Can't be on stack - how would the stack "expand"
     // to make the extra space required between main and foo?
     vec.push_back(Type());
  }

  int main() {
    vector<Type> bar;
    foo(bar);
  }

마찬가지로:

 vector<Type> *vect = new vector<Type>; //allocates vect on heap and each of the Type will be allocated on stack

비슷한 카운터 예제를 사용하여 마지막 부분을 제외하고 True입니다.

  void foo(vector<Type> *vec) {
     // Can't be on stack - how would the stack "expand"
     // to make the extra space required between main and foo?
     vec->push_back(Type());
  }

  int main() {
    vector<Type> *bar = new vector<Type>;
    foo(bar);
  }

에 대한:

vector<Type*> vect; //vect will be on stack and Type* will be on heap. 

이것은 사실이지만 Type*포인터가 힙에 있지만 포인터가 가리키는 Type인스턴스는 다음과 같을 필요는 없습니다.

  int main() {
    vector<Type*> bar;
    Type foo;
    bar.push_back(&foo);
  }

어떤 종류의 컨텍스트에서 스택을 가지지 않겠습니까? 표준에 필요하지는 않지만 실제로 말하면 스택이없는 경우는 언제입니까?
Nerdtron

3
@Nerdtron-일부 소형 마이크로 컨트롤러의 IIRC에는 마지막 호출 시점에 PC (프로그램 카운터) 이외의 다른 것을 저장할 수있는 RET 준비가 된 호출 스택이 있습니다. 따라서 컴파일러는 실행 흐름과 관련이 거의없는 고정 된 위치에 "비 재귀 기능의 경우" "자동 스토리지"를 배치하도록 선택할 수 있습니다. 전체 프로그램을 합리적으로 평평하게 만들 수 있습니다. 재귀적인 경우에도 "기능별 스택"정책이나 자동 변수 및 반환 주소에 대한 별도의 스택을 가질 수 있으므로 "스택"이라는 문구는 다소 의미가 없습니다.
Flexo

모든 것을 위해 힙 기반 할당을 사용할 수 있으며 자동 스토리지를 관리하는 "정리 스택"이있을 수 delete있습니다.
Flexo

3

이 진술 만이 사실입니다 :

vector <Type*> vect; //vect will be on stack and Type* will be on heap.

Type* 포인터의 양이 동적으로 변경 될 수 있으므로 포인터는 힙에 할당됩니다.

vect 이 경우 로컬 스택 변수로 정의했기 때문에 스택에 할당됩니다.


2
Type *은 힙 할당을 나타내지 않고 단순히 Type 객체에 대한 포인터를 나타냅니다. 즉, 벡터는 포인터를 힙에 저장합니다. int a = 5; int * ptr_to_a = & a; 벡터 <int *> vec; vec.push_back (ptr_to_a); (jpalecek의 답변 참조)
Matthew Russell

1

벡터가 내부 보유 allocator/ 메모리 할당에서 할당 해제의 책임이다 heap를 들어 vector element. 따라서 벡터를 생성하는 방법에 관계없이 벡터 element는 항상에 할당됩니다 heap. 벡터의 메타 데이터는 생성 방법에 따라 다릅니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.