QList和shared_ptr

发布于 2024-07-18 04:36:32 字数 666 浏览 11 评论 0原文

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

来源:

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

What do you think? Is this correct or are there memory leaks?

Source:

#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;
}

Output:

6
destroying A(6)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

盗琴音 2024-07-25 04:36:32

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

It seems correct. Boost's shared_ptr is a reference counting pointer. Reference counting is able to reclaim memory if there are no circular references between objects. In your case, objects of class A do not reference any other objects. Thus, you can use shared_ptr without worries. Also, the ownership semantics allow shared_ptrs to be used in STL (and Qt) containers.

瘫痪情歌 2024-07-25 04:36:32

这段代码看起来非常好。

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

This code looks perfectly fine.

If you're seeking advice perhaps you could provide more info on the purpose of using shared_ptr with QList, there might be a "Qt" way of doing this without pulling the big guns such as shared_ptr.

复古式 2024-07-25 04:36:32

如果不知道为什么 A 对象的 shared_ptr 列表首先存在,就很难提出任何建议。

查看所有权智能指针的语义。 也许对你有帮助。

其他一些可以改进的地方:

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()

It is difficult to suggest anything without knowing why the list of shared_ptrs of A objects exist in the first place.

Take a look at the ownership semantics of smart pointers. Maybe of help to you.

Some other things that can be improved:

1. Use initializer lists in ctor like:

class A {
 private:
   int m_data;
 public:
    A(int value=0) : m_data (value) {}
 // ....

2. int _tmain(int argc, _TCHAR* argv[]) is not a Standard signature;

Use

int main(int argc, char* argv[])

or just:

int main()
眼趣 2024-07-25 04:36:32

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

来源:

#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

不好。

If you're not using a smart pointer, you have to delete the list elements by yourself.

Source:

#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;
}

Output:

6

Not good.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文