QList和shared_ptr

时间:2009-04-25 19:05:36

标签: c++ qt boost qlist

你怎么看?这是正确的还是有内存泄漏?

来源:

#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 个答案:

答案 0 :(得分:1)

如果不知道为什么首先存在shared_ptr Aclass A { private: int m_data; public: A(int value=0) : m_data (value) {} // .... 个对象的列表,很难提出任何建议。

查看ownership semantics智能指针。也许对你有帮助。

其他一些可以改进的事情:

1。在ctor中使用初始化列表:

int _tmain(int argc, _TCHAR* argv[])

2。 int main(int argc, char* argv[]) 不是标准签名;

使用

int main()

或只是:

{{1}}

答案 1 :(得分:1)

此代码看起来非常好。

如果您正在寻求建议,也许您可​​以提供有关使用带有QList的shared_ptr的更多信息,可能有一种“Qt”方式可以在不拉动像shared_ptr这样的大枪的情况下这样做。

答案 2 :(得分:1)

看来是对的。 Boost的shared_ptr是一个引用计数指针。如果对象之间没有循环引用,则引用计数能够回收内存。在您的情况下,A类的对象不引用任何其他对象。因此,您可以毫无后顾之忧地使用shared_ptr。此外,所有权语义允许在STL(和Qt)容器中使用shared_ptrs。

答案 3 :(得分:1)

如果您没有使用智能指针,则必须自行删除列表元素。

来源:

#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

不好。