1

かなり単純な質問がありますが、頭を悩ませることはできません。

私はこのコードを持っていると考えてください:

#include <iostream>
#include <vector>
using namespace std;

class B
{
public:
    B(const int& val) {this->val = val;}
    int val;
};

class A
{
public:
    A() {}
    void Set(B& ptb)
    {
        ptBs.push_back(&ptb);
    }
    void Set(const int& val)
    {
        ptBs.push_back(new B(val));
    }
    std::vector<B*> ptBs;
};

int main()
{
    A* ptA = new A();
    ptA->Set(B(10));
    ptA->Set(38);

    for (int i=0; i<ptA->ptBs.size(); i++)
        cout << ptA->ptBs[i]->val << endl;

    delete ptA;

    system("pause");
    return 0;
}

出力結果は次のとおりです。

10
38

void Set(const int& val)しかし、このメソッドによって作成された配列要素で delete を呼び出さないと、メモリ リークが発生していると思います。

std::vector のどの要素がヒープ上に作成されたので、次のように ~A() デストラクタでメモリを解放できますか?

~A()
{
    for (int i=0; i<ptBs.size(); i++)
        delete ptBs[i];
}

また、一時的な新しい操作呼び出しで作成されたベクター要素を削除する必要がありますか?

おそらく、ここでは非常に単純なものは見当たりませんが、私のアプリケーションにはこの機能が本当に必要です。

PS。10 と 38 は単純な例です。Set関数は、異なる引数で何千回も呼び出すことができます。

4

2 に答える 2

3

幸いなことに、次の行はコンパイルされません。

ptA->Set(B(10));

これはB(10)、タイプ の prvalue テンポラリを作成するコンストラクタ キャスト式であるためですB。prvalue は、 への lvalue 参照B &パラメーターにバインドできませんvoid A::Set(B& ptb)。これは、ダングリング ポインターを一時的な値に格納することによる結果からユーザーを保護する C++ 言語です。

通常、アイテムを値Aで保存する方が理にかなっています。B

std::vector<B> Bs;
于 2013-02-08T14:22:21.783 に答える
2

B型のオブジェクトの所有権をのインスタンスに与えるかどうかを決定する必要がありますA。両方を混ぜても、良い結果にはなりません。このクラスを文書化することを想像してみてください:this class may or may not take ownership to the objects it holds.

私がお勧めしない別の方法は、へBのポインターへのラッパーを作成することです。これは、 B へのポインターとそのコンストラクターのブール値フラグを取り、ブール値フラグは、ポインターがスタックに割り当てられたオブジェクトまたはオブジェクトへのポインターであるかどうかを示します。ヒープ上。

于 2013-02-08T13:58:49.263 に答える