Повторное получение "auto_ptr" и управление памятью
У меня такая ситуация:
class MyClass
{
private:
std::auto_ptr<MyOtherClass> obj;
public:
MyClass()
{
obj = auto_ptr<MyOtherClass>(new MyOtherClass());
}
void reassignMyOtherClass()
{
// ... do funny stuff
MyOtherClass new_other_class = new MyOtherClass();
// Here, I want to:
// 1) Delete the pointer object inside 'obj'
// 2) Re-assign the pointer object of 'obj' to 'new_other_class'
// so that 'obj' now manages 'new_other_class' instead of the
// object that just got deleted manually
}
};
Есть ли способ добиться этого? Будет ли следующий код делать то, что я хочу?
void MyClass::reassignMyOtherClass()
{
// ... still, do more funny stuff (flashback humor :-)
MyOtherClass new_other_class = new MyOtherClass();
obj.reset(new_other_class);
}
Будет ли память о new_other_class
быть выделенным в деструкторе по умолчанию MyClass
?
2 ответа
Решение
Да, это будет. Ты можешь использовать
obj.reset( new MyOtherClass() );
И я бы лучше использовал такой конструктор
MyClass():
obj( new MyOtherClass() )
{
}
Из MSDN где описываешь reset
Функция-член оценивает выражение delete myptr, но только в том случае, если сохраненное значение указателя myptr изменяется в результате вызова функции. Затем он заменяет сохраненный указатель на ptr.
Это будет делать то, что вы хотите.