로컬 메서드 내에서 인스턴스화 된 객체가 저장되는 곳이 궁금합니다. 아는 한 객체는 힙에 저장되고 참조는 스택에 저장됩니다. 그렇다면 함수가 반환되고 객체에 대한 참조가 더 이상 존재하지 않으면 (함수의 로컬 스택 프레임이 튀어 나옴) 객체가 힙에 머물러 있는지 또는 수동으로 삭제해야합니까? 가비지 수집, Java에서와 같이)?메서드 내에서 생성 된 객체
답변
당신이 그 객체로 무엇을 할 계획인지에 달려 있습니다. 객체를 반환하면 수명이 연장됩니다. 임시로 만들면 두 가지 결과가 발생할 수 있습니다.
new
으로 개체를 만듭니다. 새 객체에 대한 포인터를 만들면 메서드가 범위를 벗어날 때 포인터가 삭제됩니다. 그러나 개체가 메모리 누수의 원인이 남아 있으므로 개체를 명시 적으로 삭제해야합니다.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;
}
새로운 객체를 사용하지 않고 객체를 만드는 방법이 있습니까? –
예, 표준 방식으로 작성하십시오. 예 : 'ObjectClass my_obj()'입니다. Java에서 왔다고 가정합니다. 'new'를 사용하면 객체가 삭제되지 않으면 메모리 누수가 발생할 수 있으므로 위험 할 수 있습니다. 10 분을 주면 PC에 도착하면 대답을 정리할 것입니다. – TomJ
팀에게 'new'와 'delete'를 사용하라고 지시합니다. 자동 저장이 항상 선호됩니다. 당신이 _ 동적으로 기억 장치를 필요로 할 때 올바른 종류의 스마트 포인터를 사용하십시오. 모든 규칙에는 분명히 예외가 있지만 책임감있게 규칙을 어긴 경험이 많은 개발자와 규칙을 올바르게 위반하는 훨씬 숙련 된 개발자가 필요합니다. –
당신이 C에 대해 물어 ++ 또는 Java 있습니까 : 여기
은 몇 가지 예제 코드? 하나를 선택하고 질문에서 다른 태그를 제거하십시오. C++ 객체와 Java 객체는 근본적으로 다릅니다. 하나에 적용되는 답은 다른 것에 적용되지 않습니다. 태그를 스팸하지 마십시오. –두 가지에 대한 답을 얻는 것이 도움이 될 것입니다. –
http://stackoverflow.com/questions/5836309/stack-memory-vs-heap-memory –