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

このコードは完全に正常に見えます。

アドバイスを求めている場合は、QListでshared_ptrを使用する目的についてより多くの情報を提供できる可能性があります。これを行うには、shared_ptrなどの大きな銃を使わずに「Qt」方法があるかもしれません。

于 2009-04-25T19:30:11.987 に答える
1

正しいようです。Boostのshared_ptrは、参照カウントポインタです。オブジェクト間に循環参照がない場合、参照カウントはメモリを再利用できます。あなたの場合、クラスAのオブジェクトは他のオブジェクトを参照しません。したがって、心配することなくshared_ptrを使用できます。また、所有権のセマンティクスにより、shared_ptrsをSTL(およびQt)コンテナーで使用できます。

于 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 に答える