2012-05-04 20 views
1

私は私のクラスのメンバーとしてCStringsの配列を持っている:CString - > Memory Leakの配列ですか?

... 
private: 
CString mStrings[7]; 
... 

クラスのデストラクタが正しく呼び出されますが、私の分析ツールは、7 mStrings(それぞれのそれぞれにメモリリークがあることを私に伝えますクラスを割り当てたり割り当てを解除したりしてください。

私はCStrings自身が自分のメモリを管理していると思っていました。私がそれらを配列に持っているという事実はここに何か変わるのですか?

+1

コードを表示します。あなたの分析ツールはいつ実行され、いつクラスが作成されるかなどなど –

+0

文字列が配列を持っていても、文字列が自分のメモリを管理しているという事実は変わりませんあなたが(自動ストレージで)表示するような配列を作成しているだけであれば、割り当てられたメモリの割り当てを明示的に解除する必要はありません。 –

+0

あなたは実際に何を行い、何がエラーであるかを示すコードをもっと提供できますか(好ましくは[sscce](http://sscce.org/))?また、このマイクロソフトのCStringまたは別のものですか?それは間違いなく標準C++ではないので、それを言及する必要があります。 – KillianDS

答えて

1

いいえ、漏れてはいけません。 newまたはnew[](またはmalloc)を割り当て、メモリを解放しないでください(delete,またはfree)とメモリを解放しない限り、リークは発生しません。

あなたのケースでは、アレイは自動ストレージにあるため、自動的にクリーンアップされます。また、CStringは自動的にメモリを管理します。どちらが偽陽性であるか、問題の原因となる他のコードがあります。

編集 - CStringはリークしませんが、偽陽性の場合はありません。

unsigned char* x = new unsigned char[10]; 
CString str(x); 

delete[] x、または類似した何かを忘れて:あなたは私のチャンスとして初期化していますか?

編集2 - たぶん、エラーがあなたのクラスの非削除されたインスタンスに来る:

struct X 
{ 
private: 
    CString mStrings[7]; 
}; 

//... 
X* x = new X; 
+0

さて、私はMemory Validatorがここで偽陽性を報告したと思います。私はツールには全く新しいので、私はそれを信用することができないのか分かりません;-) – Boris

+0

@Boris:正直言って、このような単純なユースケースで偽陽性を示したら、もう少し調べてみましょう。あなたが使っていることが間違っているか、このツールは実用的な目的では全く役に立たない。 – KillianDS

+0

@Boris私はまた、偽陽性が遠くにフェッチされていると思います、どのようにオブジェクトを構築していますか? –

0

私はCStringが実際にchar *であることをここに信仰の飛躍を作るつもりです。

これがキャストであり、クラスがそれを割り当てた場合、デストラクタはそれらの割り当てを解除する必要があります。

このオブジェクトの削除は、浅いものになります。問題があります。

最後に、CStringのタイプは何ですか?

+0

Cstringは、ユニコードまたはASCII文字列を表すことができるMS固有のデータ型です。 - http://msdn.microsoft.com/en-us/library/aa300688(v=vs.60).aspxこれは 'char * 'ではありません。 –

+0

質問にはプラットフォームは言及されていません。もしそうなら、私はその空白を埋めるでしょう。 –