QList и shared_ptr - PullRequest
       22

QList и shared_ptr

5 голосов
/ 25 апреля 2009

Что ты думаешь? Это правильно или утечки памяти?

Источник:

#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 ]

1 голос
/ 25 апреля 2009

Если вы не используете умный указатель, вы должны удалить элементы списка самостоятельно.

Источник:

#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

Не хорошо.

1 голос
/ 25 апреля 2009

Этот код выглядит отлично.

Если вам нужен совет, возможно, вы могли бы предоставить больше информации о цели использования shared_ptr с QList, возможно, существует способ «Qt», не используя большие возможности, такие как shared_ptr.

1 голос
/ 25 апреля 2009

Кажется правильным. Boost's shared_ptr является указателем подсчета ссылок. Счетчик ссылок может восстановить память, если между объектами нет циклических ссылок. В вашем случае объекты класса A не ссылаются ни на какие другие объекты. Таким образом, вы можете использовать shared_ptr без забот. Кроме того, семантика владения позволяет использовать shared_ptrs в контейнерах STL (и Qt).

1 голос
/ 25 апреля 2009

Сложно что-либо предложить, не зная, почему список 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()
...