Удалить объект smartpointer?

Фон:
Читая об умных указателях, я наткнулся на следующий пример реализации Smart Pointer на C ++.

template < typename T > class SP
{
private:
T*    pData; // Generic pointer to be stored
public:
SP(T* pValue) : pData(pValue)
{
}
~SP()
{
delete pData;
}

T& operator* ()
{
return *pData;
}

T* operator-> ()
{
return pData;
}
};

class Person
{
int age;
char* pName;

public:
Person(): pName(0),age(0)
{
}
Person(char* pName, int age): pName(pName), age(age)
{
}
~Person()
{
}

void Display()
{
printf("Name = %s Age = %d \n", pName, age);
}
void Shout()
{
printf("Ooooooooooooooooo",);
}
};

void main()
{
SP<Person> p(new Person("Scott", 25));
p->Display();
// Dont need to delete Person pointer..
}

Вопросы:

  1. Этот умный указатель дает то преимущество, что он удаляет объект класса Person, как только выходит из области видимости. Но тогда нам нужно специально добавить код «удалить p;» в основной функции, чтобы класс умных указателей не протекал сам?

  2. Поскольку класс Person также имеет функцию-деструктор, нужно ли нам вызывать delete для объекта person? Деструктор будет автоматически вызываться, когда объект Person выходит за пределы области видимости.

0

Решение

[1] Вам не нужно удалять p как вы распределяете его в стеке. Если вы сделали:

SP<Person>* p = new SP<Person>(new Person("Scott", 25));

тогда вам придется удалить его.

[2] Вам не нужно звонить delete на Person объект. Это делается умным указателем — это его цель в конце концов.

Таким образом, ваш код не имеет утечек памяти в своем текущем состоянии.
Однако в реализации интеллектуального указателя отсутствуют конструктор копирования, оператор присваивания и т. Д., Поэтому их следует добавить, чтобы избежать нежелательного поведения в будущем.

2

Другие решения

Не используйте эту реализацию. Используйте следующие классы (в порядке предпочтения):

std::shared_ptr / std::unique_ptr (C ++, 11).
std::tr1::shared_ptr / std::tr1::unique_ptr (Поддержка до C ++ 11 в Vis Studio 2008).
boost::shared_ptr / boost::unique_ptr (Если вышеупомянутые классы умных указателей не существуют в вашем компиляторе).

1

По вопросам рекламы [email protected]