2012-01-08 2 views
1

저는 C++ 메모리 관리를 처음 접했습니다. 나는 Should every class have a virtual destructor?를 읽고이 대답을 발견 : 공용 비를 가지고 있다면보호 된 소멸자가있는 객체 삭제

모든 추상 클래스는

  • 보호 소멸자 또는
  • 가상 소멸자

을해야 하나를 가상 소멸자는 파생 된 객체를 포인터를 통해 삭제할 수 있기 때문에 좋지 않습니다. 우리 모두 알다시피, 그것은 정의되지 않은 행동입니다.

포인터를 통해 삭제하려고하지 않는 클래스의 경우 가상 소멸자를 가질 이유가 없습니다. 리소스를 낭비 할뿐만 아니라 사용자에게 잘못된 힌트를 줄 것입니다. 그냥 std :: iterator에 가상 소멸자를 제공하는 것이 얼마나 엉터리인지 생각해보십시오.

그래서 나는 지금 보호 된 소멸자가 있습니다. (저는 클래스에서 파생되지 않았습니다).

다른 클래스에서는이 객체에 대한 포인터가 있지만. 내 생성자에서 나는 포인터를 그 클래스의 "새로운"객체로, 내 destrcutor에서 그것을 파괴하려고한다.

어떻게하면됩니까? 소멸자가 보호되지 않으면 나는 seg fault를 얻는다. (나는 완전히 이해하지는 못했지만 어쨌든 나쁜 프로그래밍이라고 생각한다.) 소멸자가 보호되어 있다면 객체를 삭제하는 방법을 모른다.

답변

3

위 블록에서 "추상적"이라는 용어가 누락되었습니다. "추상적 인"은 당신이 수업의 대상이 아니어야 함을 의미합니다. 클래스의 객체가 있다면, 거의 항상 public 소멸자가 있어야합니다.

+0

좋아요,하지만 소멸자를 공용으로 만들면 해당 객체를 삭제하려고 할 때 segfault가 발생합니다 – jcuenod

+0

내 문제가 삭제 될 클래스의 어딘가에 있다는 것을 알고 있습니다. 이 시점에서 나는 생성자를 생각하고있다. – jcuenod

+1

코드를 보여줘야합니다. segfault는 내장 구조가 아닌 자신의 프로그래밍에서 가능할 가능성이 높습니다 :) – filmor