저는 C++ 메모리 관리를 처음 접했습니다. 나는 Should every class have a virtual destructor?를 읽고이 대답을 발견 : 공용 비를 가지고 있다면보호 된 소멸자가있는 객체 삭제
이모든 추상 클래스는
- 보호 소멸자 또는
- 가상 소멸자
을해야 하나를 가상 소멸자는 파생 된 객체를 포인터를 통해 삭제할 수 있기 때문에 좋지 않습니다. 우리 모두 알다시피, 그것은 정의되지 않은 행동입니다.
포인터를 통해 삭제하려고하지 않는 클래스의 경우 가상 소멸자를 가질 이유가 없습니다. 리소스를 낭비 할뿐만 아니라 사용자에게 잘못된 힌트를 줄 것입니다. 그냥 std :: iterator에 가상 소멸자를 제공하는 것이 얼마나 엉터리인지 생각해보십시오.
그래서 나는 지금 보호 된 소멸자가 있습니다. (저는 클래스에서 파생되지 않았습니다).
다른 클래스에서는이 객체에 대한 포인터가 있지만. 내 생성자에서 나는 포인터를 그 클래스의 "새로운"객체로, 내 destrcutor에서 그것을 파괴하려고한다.
어떻게하면됩니까? 소멸자가 보호되지 않으면 나는 seg fault를 얻는다. (나는 완전히 이해하지는 못했지만 어쨌든 나쁜 프로그래밍이라고 생각한다.) 소멸자가 보호되어 있다면 객체를 삭제하는 방법을 모른다.
좋아요,하지만 소멸자를 공용으로 만들면 해당 객체를 삭제하려고 할 때 segfault가 발생합니다 – jcuenod
내 문제가 삭제 될 클래스의 어딘가에 있다는 것을 알고 있습니다. 이 시점에서 나는 생성자를 생각하고있다. – jcuenod
코드를 보여줘야합니다. segfault는 내장 구조가 아닌 자신의 프로그래밍에서 가능할 가능성이 높습니다 :) – filmor