1

私は次のシナリオを持っています、

class foo
{
  ...
  private:
   char *_test;
};

void foo::setTest()
{
  if( 0 != _test ) delete [] _test;
}

この関数は、まだ割り当てられていないときsetTestに削除しようとするため、呼び出されるとエラーをスローします。_testこれは、_testが0X0に設定されていないために発生しています。

誰かが私がこれを理解するのを手伝ってくれる?

4

3 に答える 3

3

コンストラクターで_testを初期化する必要がありますNULL

好き:

foo:foo {
 _test = NULL;
}

そうしないと、_testにガベージ値があります。

deleteまた、Chrisが指摘しているように、または( )に引数として渡される値は、delete[]以前に割り当てられたメモリブロックへのポインタnew、またはnullポインタ(nullポインタの場合、deleteは効果をもたらさない)のいずれかである必要があります。 NULLチェックは冗長です。

于 2010-03-04T01:55:13.713 に答える
1

まあ、_test値が割り当てられていない場合は、未定義の値があります。正気の振る舞いが必要な場合は、その値を何にも使用できません。変数は、使用する前に割り当てる必要があります。

ちなみに、nullポインタを呼び出しても安全なので、deleteチェックは冗長です。delete[]== 0

于 2010-03-04T01:54:37.240 に答える
1

2つの可能性があります:

を初期化しないfoo::_test場合、クラスの作成時にその変数にランダムデータが含まれる可能性があります。C ++はポインタをnullに初期化しません(Java、C#、または他のほとんどの高級言語とは異なります)。常に(常に!)ポインタNULLまたは有効な値を初期化する必要があります。コンストラクターに変更するchar *_test = NULL;_test、コンストラクターで初期化します。

または、_testサンプルに表示されていない別の場所で削除されているが、に設定されていない可能性がありますNULLNULLこの種のダブルフリーの問題を防ぐために、クラスメンバーを削除するときはいつでも、後でそれを設定する必要があります。

于 2010-03-04T01:55:56.840 に答える