8

xxxx.h ファイル:

struct dn_instance_pair
{
    std::string theDn;
    int theInstance;
};
typedef struct dn_instance_pair t_dn_inst_pair;

struct table_rowid_type
{
    char theTable[101];
    sqlite3_int64 theRowid;
    int operation;
};

// static class members
static vector<t_dn_inst_pair> dninstList;
static vector<t_table_rowid_type> tablerowidList;

xxxx.cpp で

// declaration of vectors.
// Included to this post only for completeness.
vector<t_dn_inst_pair> xxxx::dninstList;
vector<t_table_rowid_type> xxxx::tablerowidList;

これらのベクトルは静的コールバック関数で処理されるため、それらも静的である必要があります。

cpputest で、これらのベクトルのいずれかに何かを追加しようとすると、失敗が発生します。

Leak size: 8 Allocated at: <unknown> and line: 0. Type: "new" Content: "<\ufffdP@"

ベクトルに追加されるものは自動変数であり、通常の関数で発生します。

t_dn_inst_pair thePair;
thePair.theDn = updated_dn;
thePair.theInstance = updated_instance;

ベクトルは、テスト ケースの最後にクリアされます。

xxxx::yyyy()->dninstList.clear();

(yyyy() はシングルトン xxxx オブジェクトへのポインタを返します)

ページhttp://blog.objectmentor.com/articles/2010/02/04/cpputest-recent-experiences では、同じ種類のメモリ リークについて説明しています。

「これは誤検知です。これは 1 回限りの割り当てであり、C++ メモリ割り当てと静的初期化の副作用です。」

私の質問は次のとおりです。この失敗は本当に偽陽性ですか?

br エスコ

4

1 に答える 1

5

valgrindで確認しましたか?「確実に失われた」リークされたメモリと「まだ到達可能な」メモリを区別します。誤検知の場合でも、(ベクター内のポインターを介して)到達可能である必要があります。

要素を破棄するvector::clear()だけで、メモリの割り当てが解除されないためcapacity()、同じままであることに注意してください。

スワップトリックを実行して、ベクターにメモリの割り当てを解除させることができます。

vector<t_dn_inst_pair>().swap(xxxx::yyyy()->dninstList);

これにより、一時的な(空の)ベクトルが作成され、それがベクトルと交換されるため、ベクトルの要素と割り当てられたメモリが一時的なものに転送され、ステートメントの最後で破棄されます。

PSシングルトンは吸う、それらを使用しないでください、しかしそれが静的メンバーである場合、なぜあなたはベクトルにアクセスするyyyy()->dninstList(すなわち使用する)のですか?operator->言うxxxx::dninstListか、非静的メンバーにして、シングルトンオブジェクトを介してアクセスすることができます(ただし、シングルトンは吸うことを忘れないでください)。

于 2012-05-30T09:37:19.810 に答える