4

私はC++で配列を持っています:

Player ** playerArray;

これは、それが含まれるクラスのコンストラクターで初期化されます。

デストラクタには次のものがあります。

delete playerArray;

Valgrindを介してプログラムをテストする場合を除いて、voidポインターを削除するための呼び出しがいくつかあると表示されます。

 operator delete(void*)

このエラーを回避するために、deleteを呼び出す前に、playerArrayがvoidポインターであるかどうかをテストしたいと思います。

誰かがこれを行う方法を知っていますか?

4

3 に答える 3

5

おそらくあなたは意味しdelete [] playerArrayました。[]ポインタが単一のインスタンスではなく配列である場合に必要です。

于 2010-10-02T04:23:51.283 に答える
3

演算子deleteの定義方法は次のとおりです。

void operator delete(void*) throw();
void operator delete[](void*) throw();

'operatordelete'は'void*'を取ります。これは、任意のオブジェクトへのポインターを'void*'に変換できるためです。

ボイドは不完全なタイプであるため、ボイドを削除することはできません*すなわち

char *p = new char;
void *pv = p;
delete pv;            // not allowed

脚注78:これは、voidがオブジェクト型ではないため、void*型のポインタを使用してオブジェクトを削除できないことを意味します。

playerarrayがPlayerの配列へのポインターである場合、おそらく別の方法でそれを行いたいと思うでしょう。delete pplayerあなたが望むことをしません。

于 2010-10-02T04:36:01.987 に答える
0

valgrindが警告しているのは、削除が次のようなコンテキストで発生していることだと思います。

int foo(void *mydata){
{
    SomeClass some_value = static_cast<SomeClass> mydata;
    some_value.dosomething();
    // now we're done with it
    delete mydata;
}

キャストは問題ありませんが、voidポインターが実際にはその型であることがわかっているので、型付きポインターではなくvoidポインターを削除しているので、まだ何か怪しいことをしています。SomeClassがPODの場合、それはおそらく問題ありませんが、デストラクタで実行する必要のある重要な作業がある場合、そのデストラクタは呼び出されません。

于 2010-10-02T04:30:27.727 に答える