2014-02-28 2 views
0

이름, 길이 및 비용의 몇 가지 데이터 멤버 만 추적하는 간단한 Movie 객체가 있다고 가정 해 보겠습니다.C++ 객체 생성 및 메모리 할당

내 드라이버 파일에 Movie 객체를 만드는 경우. 어떤 선호와의 차이 :

Movie firstMovie = Movie("Titanic", 126, 13.2); 

Movie* firstMovie = new Movie("Titanic", 126, 13.2); 
우리가에 있던 방법이 될 것 인 경우에이 개체에 액세스 할 필요가있을 것 인 경우에 나는 후자라고 생각

완료되었습니다. 즉, 생성 된 첫 번째 객체가 메소드 에서처럼 초기화되면 일단 메소드가 실행되면 메모리가 할당되지 않아 연결이 끊어집니다. 내 사고 방식이 맞습니까? 이것은 숙제가 아니며 자바에서 전환 한 이후에 숨어있는 질문이 더 많습니다. 고맙습니다.

+0

두 번째 코드는'Movie * firstMovie = new Movie ("Titanic", 126, 13.2);'로 컴파일해야합니다. – PlasmaPower

+0

감사합니다. 그 변경 사항을 수정하겠습니다. –

+3

첫 번째 스택에 할당됩니다. 두 번째 것은 힙을 통해 할당됩니다. 힙을 통해 할당 한 경우 수동으로 삭제해야합니다. 스택 오버하면 삭제가 자동으로 수행됩니다. – Sumeet

답변

1

나는 두 벌금의 차이를 이해한다고 생각합니다. 대신, "나는 어느 것을 선호해야합니까?"라는 질문이 있습니다. 개인적으로, 내가 그걸 가지고 도망 칠 수 있다면, 나는 물건을 스택에 두는 것을 선호합니다. 요즘 스택은 충분히 크며 다른 버그가 있지 ​​않으면 스택 오버플로가 발생하지 않을 것입니다. 스택에 물건을 두는 것은 손으로 delete 할 필요가 없다는 것을 의미합니다. (2)있을 가능성이 큽니다. 힙에있는 것보다 메모리 캐시가 더 많으며, (3) 메모리를 할당하는 것은 가능한 빨리 할 수 ​​있습니다.

그러나 시간을내어 도망 갈 수없는 경우가 있습니다. 이 경우에는 힙에 물건을 넣으십시오.

혼란은 고슬링의 이상한 주장으로 new을 사용하여 "나를 대상으로 만들어라"는 뜻입니다. 자바 문서는 항상 당신이 delete이 될 필요가 없다는 것에 대해 자랑 스럽습니다 (가비지 컬렉터 때문에) new - 업되었지만 C++에서는 자바처럼 자주 new 일을 할 필요가 없습니다 .

2

첫째, 당신은 작성해야 :

Movie firstMove("Titanic", 126, 13.2); // Created on the stack 
Movie *pFirstMovie = new Movie("Titanic", 126, 13.2); // Created on the heap 

그렇지 않으면 당신은 객체를 생성 한 후 firstMovie에 복사하고 당신이 복사 생성자가 필요 의미합니다.

첫 번째 예제는 스택에 개체를 만들고 두 번째 예제는 스택에 개체를 만듭니다. 개체가 생성 된 함수를 종료하면 스택에있는 개체가 삭제되고이 개체에 대한 참조가 무효화됩니다.

함수 내에서 개체를 사용해야하는 경우 개체가 스택에서 가장 잘 생성되므로 메모리 누수에 대해 걱정할 필요가 없습니다.

그러나 다른 곳에서 개체를 사용하려면 new 연산자를 사용하여 힙에 개체를 만드는 것이 가장 좋습니다. 자유롭게 참조를 전달할 수 있지만 나중에 삭제할 것을 기억해야합니다.

힙에서 개체를 만드는 또 다른 장점은 많은 양의 데이터가 필요하거나 재귀가 필요할 때 힙 공간이 부족한 것보다 훨씬 빠르게 스택 공간을 실행한다는 것입니다.

+2

'객체가 생성 된 함수를 종료하면 힙의 객체가 파괴되고이 객체에 대한 참조가 무효화됩니다 .' 스택 변수에서 발생하지 않았습니까? –

+0

@uncletall : 컴파일러는 이제 며칠 동안 최적화되었으므로 복사 생성자는이 경우 호출을받지 않습니다. – Sumeet

+0

@Smeet : 컴파일러 특정 동작에 의존하는 것은 매우 나쁜 습관이라고 말합니다. – uncletall

0

당신은 간단하게 다음과 같이 객체를 인스턴스화 할 수 있습니다 :

Movie firstMovie ("Titanic", 126, 13.2);

당신은 당신이 원시 포인터를 초기화 할 때 새 키워드를 사용해야합니다.

Movie *firstMovie = new Movie("Titanic", 126, 13.2);

차이는 다른 개체가 . 표기법을 사용하면서 멤버 함수에 액세스 할 때 포인터 -> 오브젝트를 사용한다는 것이다. 또한 포인터 개체는 힙에 할당되는 반면 다른 개체는 스택에 할당됩니다.

0
Movie firstMovie = Movie("Titanic", 126, 13.2); 

inturn이 firstMovie에 할당되는 생성자를 호출하여 개체를 만듭니다.이 작업을 수행하는 더 나은 방법은 동적으로 힙에 객체를 생성하는

Movie* firstMovie = new Movie("Titanic", 126, 13.2); 

당신이 더 이상 필요하면 delete를 사용하여이 객체를 삭제할 필요가 두 번째 경우

Movie firstMovie("Titanic", 126, 13.2); 

될 것입니다.

delete firstMovie;

1

메모리는 모두 할당됩니다

Movie firstMovie("Titanic", 126, 13.2);

Movie* firstMovie = new Movie("Titanic", 126, 13.2);

차이가 밖으로 즉시 파괴 될 것이다 첫 번째 오는대로

을 두 번째 항목은 별도로 삭제할 때까지 동일하게 유지됩니다. 두 번째 방법은 동적 메모리 할당이라고하며 heap에 메모리가 할당됩니다. 첫 번째 경우에는 메모리가 stack에 할당됩니다.