QList и shared_ptr
Как вы думаете? Это правильно или есть утечки памяти?
Источник:
#include <QList.h>
#include <boost/shared_ptr.hpp>
#include <iostream>
class A {
private:
int m_data;
public:
A(int value=0) { m_data = value; }
~A() { std::cout << "destroying A(" << m_data << ")" << std::endl; }
operator int() const { return m_data; }
};
int _tmain(int argc, _TCHAR* argv[])
{
QList<boost::shared_ptr<A> > list;
list.append(boost::shared_ptr<A>(new A(6)));
std::cout << int(*(list.at(0))) << std::endl;
return 0;
}
Выход:
6
destroying A(6)
4 ответа
Это кажется правильным. Boost's shared_ptr является указателем подсчета ссылок. Счетчик ссылок может восстановить память, если между объектами нет циклических ссылок. В вашем случае объекты класса A не ссылаются ни на какие другие объекты. Таким образом, вы можете использовать shared_ptr без забот. Кроме того, семантика владения позволяет использовать shared_ptrs в контейнерах STL (и Qt).
Трудно что-то предложить, не зная, почему список shared_ptr
с A
объекты существуют в первую очередь.
Взгляните на семантику владения умными указателями. Может быть, вам поможет.
Некоторые другие вещи, которые можно улучшить:
1. Используйте списки инициализаторов в ctor, например:
class A {
private:
int m_data;
public:
A(int value=0) : m_data (value) {}
// ....
2. int _tmain(int argc, _TCHAR* argv[])
не является стандартной подписью;
использование
int main(int argc, char* argv[])
или просто:
int main()
Если вы не используете умный указатель, вы должны удалить элементы списка самостоятельно.
Источник:
#include <QList.h>
#include <boost/shared_ptr.hpp>
#include <iostream>
class A {
private:
int m_data;
public:
A(int value=0) { m_data = value; }
~A() { std::cout << "destroying A(" << m_data << ")" << std::endl; }
operator int() const { return m_data; }
};
int _tmain(int argc, _TCHAR* argv[])
{
QList<A *> list;
list.append(new A(6));
std::cout << int(*(list.at(0))) << std::endl;
return 0;
}
Выход:
6
Нехорошо.
Этот код выглядит отлично.
Если вам нужен совет, возможно, вы могли бы предоставить больше информации о цели использования shared_ptr с QList, возможно, существует способ "Qt", не используя большие возможности, такие как shared_ptr.