2016-10-10 1 views
0

"새"키워드로 생성자에서 생성 된 구조체 내부의 구조체가 어디에 있는지 궁금합니다. 스택 또는 힙에 있습니까? , 내가 힙의 노드 객체를 만드는거야 이해, 내가 노드에 대한 포인터를 만든 다음 나는 그것에 new Node()를 할당 할 때마다C++ : 생성자를 사용하여 생성 된 다른 객체 안에 객체가있는 경우 해당 내부 객체가 스택 또는 힙에 있습니까?

struct Employee{ 
    int code; 
    string name; 
    double wage; 
}; 

struct Node { 
    Employee employee; 
    Node* next; 
}; 

: 의 내가 이러한 정의는 단일 연결 목록을 만들 수 있다고 가정 해 봅시다 그 필드는 -> 연산자를 사용하여 역 참조 할 수 있습니다. 그러나 나는 점을 사용하는 데 필요한 내부 구조체의 필드에 액세스하는 등의 연산자하려고하면

Node* pointer = new Node(); 
pointer->employee.name="John Doe"; 

그래서이 직원 객체가 스택 또는 힙 내부에 생성 된 경우 궁금한데을 (.) . 기본적으로 힙에 객체를 만들면 멤버 변수의 모든 내부 객체도 힙에 만들어 집니까?

감사합니다.

+1

외부 물체가 사는 곳은 IIRC입니다. –

답변

1

여전히 힙이 있습니다! 'new'연산은 sizeof (Node) 바이트에 대한 힙에 대한 malloc이며, sizeof (Employee) + sizeof (Node *)와 같습니다. 따라서 name은 힙에 있습니다. 그리고 '알고 있어야합니다.' C/C++ 컴파일러가 일부 멤버에 액세스하는 방법 일 뿐이며 힙이나 스택에 대한 메모리는 전혀 사용하지 않습니다.

1

->.은 요소가 힙 또는 스택에 있는지 여부에 관계 없습니다. A ->포인터 일 때 개체 인 일 때 . 일 때 사용됩니다. 당신은 포인터를 사용하여 값을 스택에 구조체를 만들고 액세스 할 수 있습니다 :

struct Foo 
{ 
    int i; 
}; 
Foo f; // object on stack 
f.i = 5; // access object 
Foo* p_f = &f; // get pointer to address of object (which is still on the stack) 
p_f->i = 3; // access object through pointer 

귀하의 질문에 대답하려면 pointer 힙의 삶 점 등 문자열 pointer->employee.name을 수행하는 노드를.

new은 생성자가 아니지만, Node()은 생성자입니다.

1

무엇이든 new은 힙에 있으며, delete을 호출하여 명시 적으로 릴리스해야합니다. 다른 모든 것은 스택에 있습니다.