C++ std::list::clear()가 소멸자를 호출하지 않는 이유는 무엇입니까?
-
11-12-2019 - |
문제
이 코드를 보세요:
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
요소에 대한 포인터가 아닌 '실제' 요소를 사용하는 경우에는 이 문제가 발생하지 않습니다.
제휴하지 않습니다 StackOverflow