문제

이 코드를 보세요:

class test
{
    public:
        test() { cout << "Constructor" << endl; };
        virtual ~test() { cout << "Destructor" << endl; };
};

int main(int argc, char* argv[])
{
    test* t = new test();
    delete(t);
    list<test*> l;
    l.push_back(DNEW test());
    cout << l.size() << endl;
    l.clear();
    cout << l.size() << endl;
}

그런 다음 이 출력을 살펴보세요.

    Constructor
    Destructor
    Contructor
    1
    0

질문은 ~이야:목록 요소의 소멸자가 호출되지 않는 이유는 무엇입니까? l.clear()?

도움이 되었습니까?

해결책

목록은 포인터입니다.포인터에는 소멸자가 없습니다.소멸자를 호출하려면 list<test>를 사용해야합니다.

다른 팁

다음을 사용하여 포인터를 해제하는 더 나은 대안 delete, 또는 이를 추상화하는 것(예: 스마트 포인터 또는 포인터 컨테이너)을 사용하는 것은 단순히 스택에 직접 객체를 생성하는 것입니다.

당신은 선호해야 test t; ~ 위에 test * t = new test(); 스마트하든 아니든 리소스를 소유한 포인터를 처리하고 싶은 경우는 거의 없습니다.

만약 당신이 std::list 요소에 대한 포인터가 아닌 '실제' 요소를 사용하는 경우에는 이 문제가 발생하지 않습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top