2016-09-28 1 views
0

그래서 C++의 클래스에 소멸자 함수를 추가했습니다. C++의 소멸자 및 delete() 메서드

class object { ~object() }; 

그리고

하여
object *pointer = new object; 

나는 여전히 프로그램의 끝에서

delete(object); 

방법을 사용해야합니까 힙에 할당, 새로운 방법으로 객체를 선언 ? (소멸자가 이미 정확히 이것에 책임이 있습니까?)

+0

예,이 경우 소멸자를 호출하고 메모리 할당을 취소하려면 여전히 'delete'를 호출해야합니다. –

+0

또는'std :: unique_ptr 포인터 (새 객체());) 그리고 네이 키드 포인터가 자원을 소유하는 것을 중지하십시오. – WhozCraig

+0

그리고 새 것처럼 delete는 괄호를 필요로하지 않습니다. – Rene

답변

0

소멸자는 정리 프로세스를 사용자 정의하는 방법입니다 (로깅 추가, 3/5 규칙에 따라 정리 정리 등). 여전히 delete이 필요합니다. 그렇지 않으면 메모리 누수가 발생합니다.

말했다되는 것이이시 - 찌푸리게하고 코드를 작성하는 나쁜 관행을 간주하는 actially 요구new들과 delete의 (특히 후자). 힙에 객체를 저장해야하는 경우 unique_ptr/shared_ptr 또는 vector과 같은 컨테이너를 사용하십시오.

시간이 있으시면 허브 셔터의 이야기를 C++ Con 2016 : Leak-Freedom in C++에서 시청하시기 바랍니다.

0

개체 수명이 끝날 때 소멸자가 호출됩니다. 힙 할당 객체의 경우 삭제할 때이를 의미합니다. 그래서

delete(object); 

를 호출하여 descructor를 호출하고 할당 된 메모리를 해제합니다.

2

delete(object)으로 전화해야합니다. 객체를 삭제하는 방법은 소멸자가 담당하며 삭제시기는 delete(object)입니다. 하지만 현대 C++에서 알몸 포인터는 사용법이 좋지 않은 것으로 간주됩니다. 메모리 관리를 위해 std :: unique_ptr과 같은 스마트 포인터를 사용하는 것을 고려해야합니다.

0

예, Delete 메소드가 필요합니다.

Default destructors 통화 멤버 objects의 소멸자하지만 NOT 개체에 포인터를 삭제 않습니다. 따라서, 명시 적으로 삭제를 호출하는 소멸자를 작성해야합니다. 마찬가지로

delete pointer; 
0

두 가지 종류의 메모리가 있습니다. 스택.

당신은 힙 (당신이 new 등을 malloc 전화) 당신이 가지고에

모든 (생성자를 호출 삭제의 단계 중 하나) 범위 밖으로 갈 때 스택에 모든 자체를 삭제 자신에 의해 명시 적으로 삭제합니다 (그러면 소멸자가 호출됩니다).

unique_ptr/shared_ptr과 같은 스마트 포인터는 힙 개체의 수동 삭제를 제거하고 개체가 더 이상 필요하지 않을 때 삭제되도록하는 최신 C++ 방법입니다.

0

프로그램의 마지막에 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 

을 따라서 당신이

새로운 : (사업자 새로운되지 않고 삭제하는)

0

새로운 및 삭제 발현은 두 통화를 호출된다 리소스 (메모리) 유출을 피하기 위해 새로운 것과 삭제를 쌍으로 만듭니다. 그러나 개체 생성 및 삭제에는 새로 만들기 및 삭제가 필요하지 않습니다.