来源:
#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)
答案 0 :(得分:1)
如果不知道为什么首先存在shared_ptr
A
个class 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
不好。