2016-12-02 3 views
-1

로컬 메서드 내에서 인스턴스화 된 객체가 저장되는 곳이 궁금합니다. 아는 한 객체는 힙에 저장되고 참조는 스택에 저장됩니다. 그렇다면 함수가 반환되고 객체에 대한 참조가 더 이상 존재하지 않으면 (함수의 로컬 스택 프레임이 튀어 나옴) 객체가 힙에 머물러 있는지 또는 수동으로 삭제해야합니까? 가비지 수집, Java에서와 같이)?메서드 내에서 생성 된 객체

+1

당신이 C에 대해 물어 ++ 또는 Java 있습니까 : 여기

은 몇 가지 예제 코드? 하나를 선택하고 질문에서 다른 태그를 제거하십시오. C++ 객체와 Java 객체는 근본적으로 다릅니다. 하나에 적용되는 답은 다른 것에 적용되지 않습니다. 태그를 스팸하지 마십시오. –

+0

두 가지에 대한 답을 얻는 것이 도움이 될 것입니다. –

+0

http://stackoverflow.com/questions/5836309/stack-memory-vs-heap-memory –

답변

2

당신이 그 객체로 무엇을 할 계획인지에 달려 있습니다. 객체를 반환하면 수명이 연장됩니다. 임시로 만들면 두 가지 결과가 발생할 수 있습니다.

  1. new으로 개체를 만듭니다. 새 객체에 대한 포인터를 만들면 메서드가 범위를 벗어날 때 포인터가 삭제됩니다. 그러나 개체가 메모리 누수의 원인이 남아 있으므로 개체를 명시 적으로 삭제해야합니다.

  2. new을 사용하지 않는 경우. 범위가 끝나면 개체가 삭제됩니다.

이러한 결과는 모두 개체를 반환하지 않고 함수에서 임시 개체로 인스턴스화했다고 가정합니다.

class ObjectClass { 
public: 
     ObjectClass() {} 

}; 

void myFunction() { 
     ObjectClass my_obj(); //memory is handled for you 
     ObjectClass * my_dynamic_obj = new ObjectClass(); 
     delete my_dynamic_obj; //if delete is not called then 
     // the pointer my_dynamic_obj will be deleted but the object itself will remain 
     return; 
} 

main() { 
     myFunction(); 
     return 0; 
} 
+0

새로운 객체를 사용하지 않고 객체를 만드는 방법이 있습니까? –

+0

예, 표준 방식으로 작성하십시오. 예 : 'ObjectClass my_obj()'입니다. Java에서 왔다고 가정합니다. 'new'를 사용하면 객체가 삭제되지 않으면 메모리 누수가 발생할 수 있으므로 위험 할 수 있습니다. 10 분을 주면 PC에 도착하면 대답을 정리할 것입니다. – TomJ

+1

팀에게 'new'와 'delete'를 사용하라고 지시합니다. 자동 저장이 항상 선호됩니다. 당신이 _ 동적으로 기억 장치를 필요로 할 때 올바른 종류의 스마트 포인터를 사용하십시오. 모든 규칙에는 분명히 예외가 있지만 책임감있게 규칙을 어긴 경험이 많은 개발자와 규칙을 올바르게 위반하는 훨씬 숙련 된 개발자가 필요합니다. –