1

現在のプロジェクトで苦労しています。以前のバージョンでは std::vectors を使用していましたが、すべて問題なく動作し、メモリ リークもエラーも発生しませんでした。

次に、よりエレガントでパフォーマンスが少し向上したため、いくつかのポインターを使用するように切り替えました。

だから私は次のようなクラスを持っています

class A
{
    private:
        std::string str;
    public:
        A() {str = "";}
};

class B
{
    private:
        std::string str;
        A* a;
    public:
        B() {str = ""; a = NULL; }
};

class C
{
    private:
        std::vector<B*> bs;
    public:
        C() { bs = std::vector<B*>(); }

};

を使用するたびに、後でそれを使用する必要があることを知っていnewますdeleteclass Bそこで、とのデストラクタを作成しますclass C

それは私がそれが次のように見えるべきだと思うものです:

B::~B()
{
    if ( this->a != NULL )
        delete this->a;
}

C::~C()
{
    while ( (this->bs).size() > 0 )
    {
        if ( (this->bs).back() != NULL )
            delete (this->bs).back();
        (this->bs).pop_back();
    }
    (this->bs).clear(); // not necessary since bs has size 0?
}

しかし、それでは、valgrind で「サイズ 4 の読み取りが無効です」など、さまざまなエラーが発生します。

デストラクタがどのように見えるべきかについての私の考えは大丈夫ですか? 私のコードで他に何が問題になる可能性がありますか? プライベートstd::stringメンバーをstd::string-pointers に変更するとよいでしょうか。str = "";デストラクタで行う必要があるか、それとも良いことですか?

余談ですが、「適切なデストラクタ」や同様のキーワードで多くの検索を行ったが、役に立たなかったことを理解してください。これがあまりにも頻繁に尋ねられたと思われる場合: わかりません。

4

1 に答える 1

1

ロブが言ったこと、およびデストラクタも次のように単純化できます。

B::~B()
{
    delete a;
}

C::~C()
{
    for (size_t i = 0; i < bs.size(); ++i)
        delete bs[i];
}
于 2012-05-11T14:26:37.140 に答える