2012-10-19 4 views
2

'새'키워드와 클래스 저장 : When should I use the new keyword in C++?이 질문과 병행

이의 나는 다음과 같은 코드 구조 있다고 가정 해 봅시다 :

class Foo{ 
private: 
    int a; 
    int b; 
    /* ect */ 
}; 

class Bar{ 
private: 
    Foo A; 
    /* ect */ 
}; 

int main() { 
    Bar *b; 
    b = new Bar(); 

    // call b->methods() 

    delete b; 
}; 

내가 b 위의 링크에서 알 힙 (무료 저장소입니다) 할당. 하지만 내부 A 내용은 b 안에 무엇이 있습니까? A도 힙을 할당한다고 가정하는 것이 안전한가요?

+3

'b'가 프리 스토어에 할당되었지만 _its 내용이 프리 ​​스토어에 할당된다는 것은 무엇일까 ?_? –

+2

사실'b'는 무료 저장소에 없습니다. 'b'는 포인터이고'main' 함수의 자동 변수입니다. 'main'의 두 번째 줄에 할당되면, 그것은 자유 저장소에서 할당 된 메모리를 가리 킵니다. 대담한 차이와 나는 당신이 이미 그것에 관해 알기를 기대한다. 그러나 충분한 사람들은 지나치게 혼란스러워서 그런 것들을 똑바로 유지할 가치가 있다고 생각한다 .-) 마찬가지로 클래스 b도없고, 클래스'Bar'이다. , 'b'의 참조는 그 클래스의 인스턴스이다. –

+1

@SteveJessop 예, 저는 그가 사용하고있는 용어를 사용하여 이해할 수있었습니다. 그러나 당신의 요지는 잘 받아 들여지고 있습니다. 아마'* b'가 무료 저장소에 할당되었다고 말하는 것이 낫습니다. –

답변

8

"힙에서"는 pedantically, 약간의 명칭입니다. C++은 힙 사용을 지시하지 않고 지정되지 않은 "프리 스토어"에 new을 사용하여 할당 된 객체 만 할당됩니다. B 유형 A의 멤버 변수를 가지고 어쨌든 ...

예, 해당 개체의 모든 자유 매장에 다음 new을 사용하여 B입니다 인스턴스화합니다. ("스택에"예)

B* b = new B;

b자체는 무료로 매장에없는 것이 아니라 자동 변수 :

그것은 당신이 할 때 그러나 유의하는 것이 중요합니다. b을 가리키며 무료로 판매됩니다. 자동 변수는 범위를 벗어나면 파괴됩니다. 그러나이 경우 b이 가리키는 점은 무시됩니다. delete b;을 사용하지 않으면 메모리 누수가 발생합니다.

이것은 혼동을 줄 수 있으며 중요하지 않게 보일 수 있습니다. 어쩌면 혼란 스럽지만 중요한 것은 아닙니다. 사실 b이 무료 저장소에서 무언가를 가리키는 자동 변수이므로 스마트 포인터와 같은 것들에 사용되는 RAII로 알려진 매우 중요한 숙어를 가능하게합니다.

shared_ptr<B> b(new B);

b 여기 여전히 자동 변수이다. 그러나 b이 범위를 벗어나 파괴되면, b이 그걸 가리킨다. 여기서 스마트 포인터를 사용하면 위의 delete b을 만들지 않았을 때 생성 된 메모리 누출을 제거하는 데 도움이됩니다.

관련 문제