Фон:
Читая об умных указателях, я наткнулся на следующий пример реализации 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..
}
Вопросы:
Этот умный указатель дает то преимущество, что он удаляет объект класса Person, как только выходит из области видимости. Но тогда нам нужно специально добавить код «удалить p;» в основной функции, чтобы класс умных указателей не протекал сам?
Поскольку класс Person также имеет функцию-деструктор, нужно ли нам вызывать delete для объекта person? Деструктор будет автоматически вызываться, когда объект Person выходит за пределы области видимости.
p
как вы распределяете его в стеке. Если вы сделали:
SP<Person>* p = new SP<Person>(new Person("Scott", 25));
тогда вам придется удалить его.
[2] Вам не нужно звонитьdelete
на Person
объект. Это делается умным указателем — это его цель в конце концов.
Таким образом, ваш код не имеет утечек памяти в своем текущем состоянии.
Однако в реализации интеллектуального указателя отсутствуют конструктор копирования, оператор присваивания и т. Д., Поэтому их следует добавить, чтобы избежать нежелательного поведения в будущем.
Не используйте эту реализацию. Используйте следующие классы (в порядке предпочтения):
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
(Если вышеупомянутые классы умных указателей не существуют в вашем компиляторе).