그래서 C++의 클래스에 소멸자 함수를 추가했습니다. C++의 소멸자 및 delete() 메서드
class object { ~object() };
그리고
하여object *pointer = new object;
나는 여전히 프로그램의 끝에서
delete(object);
방법을 사용해야합니까 힙에 할당, 새로운 방법으로 객체를 선언 ? (소멸자가 이미 정확히 이것에 책임이 있습니까?)
그래서 C++의 클래스에 소멸자 함수를 추가했습니다. C++의 소멸자 및 delete() 메서드
class object { ~object() };
그리고
하여object *pointer = new object;
나는 여전히 프로그램의 끝에서
delete(object);
방법을 사용해야합니까 힙에 할당, 새로운 방법으로 객체를 선언 ? (소멸자가 이미 정확히 이것에 책임이 있습니까?)
소멸자는 정리 프로세스를 사용자 정의하는 방법입니다 (로깅 추가, 3/5 규칙에 따라 정리 정리 등). 여전히 delete
이 필요합니다. 그렇지 않으면 메모리 누수가 발생합니다.
말했다되는 것이이시 - 찌푸리게하고 코드를 작성하는 나쁜 관행을 간주하는 actially 요구new
들과 delete
의 (특히 후자). 힙에 객체를 저장해야하는 경우 unique_ptr
/shared_ptr
또는 vector
과 같은 컨테이너를 사용하십시오.
시간이 있으시면 허브 셔터의 이야기를 C++ Con 2016 : Leak-Freedom in C++에서 시청하시기 바랍니다.
개체 수명이 끝날 때 소멸자가 호출됩니다. 힙 할당 객체의 경우 삭제할 때이를 의미합니다. 그래서
delete(object);
를 호출하여 descructor를 호출하고 할당 된 메모리를 해제합니다.
delete(object)
으로 전화해야합니다. 객체를 삭제하는 방법은 소멸자가 담당하며 삭제시기는 delete(object)
입니다. 하지만 현대 C++에서 알몸 포인터는 사용법이 좋지 않은 것으로 간주됩니다. 메모리 관리를 위해 std :: unique_ptr과 같은 스마트 포인터를 사용하는 것을 고려해야합니다.
예, Delete
메소드가 필요합니다.
Default destructors
통화 멤버 objects
의 소멸자하지만 NOT
개체에 포인터를 삭제 않습니다. 따라서, 명시 적으로 삭제를 호출하는 소멸자를 작성해야합니다. 마찬가지로
delete pointer;
두 가지 종류의 메모리가 있습니다. 스택 및 힙.
당신은 힙 (당신이 new
등을 malloc
전화) 당신이 가지고에
모든 (생성자를 호출 삭제의 단계 중 하나) 범위 밖으로 갈 때 스택에 모든 자체를 삭제 자신에 의해 명시 적으로 삭제합니다 (그러면 소멸자가 호출됩니다).
unique_ptr
/shared_ptr
과 같은 스마트 포인터는 힙 개체의 수동 삭제를 제거하고 개체가 더 이상 필요하지 않을 때 삭제되도록하는 최신 C++ 방법입니다.
프로그램의 마지막에
delete(object);
메서드를 사용해야합니까?
예.
소멸자가 이미 이것을 정확히 담당하지 않았습니까?
번호
귀하의 delete ptr;
가 이이 소멸자를 호출하는 것입니다. 소멸자를 선언하지 않았다면, 당신을 위해 선언되었을 것입니다. 그래서 아무런 효과가 없습니다.
개체에 자동 저장 기간 (매우 느슨하게 "new
"을 만들지 않았을 때)이있는 경우 delete ptr;
을 쓸 필요가 없습니다. 그 이유는 해당 작업이 자동으로 수행되기 때문입니다.
그러나 두 경우 모두 소멸자가 호출됩니다. 삭제
1) call the operator new for memory allocation
2) invoke the appropriate constructor
:
1) invoke the destructor
2) call the operator delete for memory deallocation
을 따라서 당신이
새로운 : (사업자 새로운되지 않고 삭제하는)
새로운 및 삭제 발현은 두 통화를 호출된다 리소스 (메모리) 유출을 피하기 위해 새로운 것과 삭제를 쌍으로 만듭니다. 그러나 개체 생성 및 삭제에는 새로 만들기 및 삭제가 필요하지 않습니다.
예,이 경우 소멸자를 호출하고 메모리 할당을 취소하려면 여전히 'delete'를 호출해야합니다. –
또는'std :: unique_ptr
그리고 새 것처럼 delete는 괄호를 필요로하지 않습니다. – Rene