2009-09-22 2 views
7
class A 
{ 
public: 
    A(); 
    ~A(); 
    int X; 
}; 

A::A() 
{ 
    X = 5; 
    int Y = 4; 
} 

//..... in another file 
A * objectOnHeap = new A(); 

이 경우 "objectOnHeap"은 힙에 있으므로 특별히 룩업되지 않은 X에도 불구하고 힙에 X가 있습니까? 그리고이 경우 Y는 스택에 할당됩니다 (물론 범위를 벗어납니다). 맞습니까?힙에있는 오브젝트의 멤버 변수도 자동으로 힙에 있습니까?

개체가 메모리에 저장되는 방법을 생각하려고 할 때 전선을 교차 시켰는지 궁금합니다.

+1

'objectOnHeap'은 힙에 *없는 *입니다. 스택 또는 데이터 세그먼트에 있습니다. 그 값은 힙의 어떤 것을 가리키는 * 포인터입니다. –

+0

@Rob Kennedy, 데이터 세그먼트에 대해 자세히 설명해 주시겠습니까? 포인터 자체가 스택에 있지만 포인터가 가리키는 데이터가 힙에 저장되어 있다는 점을 알 수 있습니다. – BuckFilledPlatypus

답변

17

예. 힙에 있습니다. 기본적으로 힙의 객체에 할당 된 공간은 모든 멤버 변수를 보유 할만큼 충분히 큽니다.

5

예, 힙에 있습니다.

일부 세부 정보 : 당신이 "새로운"연산자를 사용하면, 무슨 일 컴파일러도 될 수있는 (모든 멤버 변수에 필요한 모든 공간을 포함, 클래스의 힙에 충분한 공간을 할당하는 것입니다 클래스의 경우, 크기를 계산해야하는 경우 등).

이 후, 생성자는 데이터 멤버 클래스에서 호출 된 다음 클래스 자체에서 호출됩니다.

특별히 힙에 메모리를 할당하지 않으면 (일반적으로 new 연산자를 사용하거나 사용자를 대신하는 함수를 호출하여) 메모리는 스택의 y 변수와 같이 스택에 할당됩니다.

3

나는 당신의 질문의 절반이 여전히 답을 찾지 못했다고 생각한다 : Y가 여전히 스택에 할당되어 있는지 묻고 있었다. 맞다.

0

Y는 로컬로 생성되므로 스택에 있습니다. X가 힙에 있습니다.

관련 문제