5

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

来源:

#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

4 回答 4

1

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()
于 2009-04-25T19:11:56.650 回答
1

这段代码看起来非常好。

如果您正在寻求建议,也许您可​​以提供有关将 shared_ptr 与 QList 一起使用的目的的更多信息,可能有一种“Qt”方式可以做到这一点,而无需使用诸如 shared_ptr 之类的大枪。

于 2009-04-25T19:30:11.987 回答
1

这似乎是正确的。Boost 的 shared_ptr 是一个引用计数指针。如果对象之间没有循环引用,引用计数能够回收内存。在您的情况下, A 类的对象不引用任何其他对象。因此,您可以放心使用 shared_ptr。此外,所有权语义允许在 STL(和 Qt)容器中使用 shared_ptrs。

于 2009-04-25T19:31:35.900 回答
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

不好。

于 2009-04-25T19:56:26.900 回答