new Time(1,0,0)
으로 SmartPtr 클래스를 초기화합니다.`new '로 만든 임시 객체에서'delete '가 호출되는시기는 언제입니까?
//main.cpp
int main()
{
SmartPtr pTime0(new Time(0,0,1));
}
여기 new Time(1,0,0)
에서 삭제를 부르고 있습니다. 모든 것이 잘 작동하며, 프로그램은이를 준수하고 실행됩니다. 하지만 혼란 스럽네요 - 어디서해야합니까 /하지 말아야합니까? delete Time(1,0,0)
?
여기서 임시 개체 생성 및 삭제의 개념을 이해하지 못합니다. 내가 쓸 때마다 new
어딘가에 내가 delete
을 써야한다는 것을 안다! 누군가 delete Time(1,0,0)
이 어디에서 발생하는지 설명해주세요.
SmartPtr pTime0 (새 시간 (0,0,1)) < - new
여기서 새롭게 할당 된 메모리에 대한 포인터를 반환하고 ctor에서 두 번째로 new
메모리를 할당합니까 ??
//SmartPtr.cpp
SmartPtr::SmartPtr(Pointee * p):_pointee(new Pointee(*p))
{}
SmartPtr::~SmartPtr()
{
delete _pointee;
}
가 SmartPtr 당신이 디자인 클래스가 따라야한다? 개체 수명을 잘 관리하여 클래스가 삭제할시기를 결정할 수 있습니다. –
SmartPtr의 ctor에있는 힙에 새 Pointee를 만드는 이유가 이해가 안됩니다. 이것은 당신이 원하는 것이 아닙니다. 단순히'_pointee (p)'라고 써야합니다. 즉, 주어진 포인터와 동일한 포인터를 사용하면됩니다. 귀하의 진술은 새로운 Pointee를 할당하고 그것에 제공된 포인터의 내용을 복사합니다. – leemes
'_pointee (p)'하고 싶지 않습니다. p (new Time (0,0,1))이 수업 외 다른 곳에서 만들어지면 어딘가에 삭제 될 수도 있고 ('delete p'), SmartPtr 소멸자는'delete _pointee''(p)', 그래서 런타임 오류가 발생합니다.달성하고자하는 개념은 ctor에 메모리를 할당하고 dtor에서 메모리를 삭제하는 것입니다. – Oleksandra