1

プログラムで少しメモリリークが発生していますが、これが唯一の可能性があると思います。

if (inputType == 'S')
{
    SavingAccount* savingAccount = new SavingAccount();
    inFile >> *savingAccount;

    accounts.push_back(savingAccount);
}

プログラムの最後にポインタのベクトルが削除されますが、私が持っている 3 種類のアカウントに対応しているように見える 3 つのエラー リークがあります。そうは言っても、ポインターをベクターに入れた後にポインターを削除すると、ベクター内のエントリも削除されます(これは予想通りでした)。

これを解決する方法を知っている人はいますか?

編集:

void Transaction::cleanUp()
{
    for (int i = 0; i < accounts.size(); i++)
    {
        delete accounts[i];
    }

    accounts.clear();
}

クリーンアップ コードが追加されました。

編集:解決済み

私の問題は、クラスのデストラクタほどベクトルとは関係がありませんでした。仮想デストラクタを定義していなかったため、基本クラスのみが消去され、派生クラスのフラグメントが残りました。これを追加した後、メモリリークはありません。

4

4 に答える 4

7

ベクトルにポインターが必要なのはなぜですか? SavingAccount私はあなたのコードの多くを見ていませんが、あなたのクラスがコピー構築可能であれば、以下のこれも同様に機能する可能性があります:

if (inputType == 'S')
    {
        SavingAccount savingAccount;
        inFile >> savingAccount;

        accounts.push_back(savingAccount); //puts a copy in the vector, so your class needs a copy ctor + Rule of Three applied.
    }

編集

OPを見ると、彼はポリモーフィックなクラス構造を持っていると言っているので、OPはそれを使用しstd::unique_ptrて格納するか、ポインタを格納するために設計されたstd::vectorものを使用することを検討する必要があります。boost::ptr_vector

于 2012-09-21T08:13:25.743 に答える
3

std::vectorベクトルに対してofまたはループを使用してstd::unique_ptr<SavingAccount>、ベクトルが範囲外になるか削除される前にすべての要素を削除します。

于 2012-09-21T08:12:17.343 に答える
2

ベクターを破棄する前に削除するか、スマート ポインターをベクターに格納することができます。

于 2012-09-21T08:11:19.210 に答える
2

SavingAccount*ベクターを破棄する前に、ベクターに保存されている を削除します。

または、可能であればスマート ポインターを使用します。

于 2012-09-21T08:11:51.827 に答える