3

void ポインターの配列を宣言しています。それぞれが任意の型の値を指します。
void **values; // Array of void pointers to each value of arbitary type

次のように値を初期化します。


    values = (void**)calloc(3,sizeof(void*));
    //can initialize values as: values = new void* [3];
    int ival = 1;
    float fval = 2.0;
    char* str = "word";
    values[0] = (void*)new int(ival);
    values[1] = (void*)new float(fval);
    values[2] = (void*)str;

    //Trying to Clear the memory allocated
    free(*values); 
    //Error: *** glibc detected *** simpleSQL: free(): invalid pointer: 0x080611b4
    //Core dumped
    delete[] values*;
    //warning: deleting 'void*' is undefined
    //Similar Error.

値に割り当てられたメモリ (void ポインタの配列) を解放/削除するにはどうすればよいですか?

4

7 に答える 7

7

問題は、あなたが割り当てた方法にあると思われますvalues: 。それは単なる.values = (void*)calloc(3,sizeof(void))sizeof(void *)sizeof(void)

sizeof(void) はゼロまたは意味をなさないその他のものである可能性があるため、最初からメモリを実際に割り当てているわけではありません...割り当てが機能するのは運が悪く、割り当てを解除しようとするとエラーがポップアップします想い出。

new編集: C++ スタイルの/deleteと Cスタイルのmalloc/を交互に使用することで、問題が発生することもありますfree。したこともしたこともなければ両方使ってもいいdeletemallocですfreenew、このままだと頭の中でごちゃまぜになってしまいます。

于 2008-10-15T20:28:19.780 に答える
6

動的に割り当てられる 3 つのものがあり、2 つの異なる方法で解放する必要があります。

delete reinterpret_cast<int*>( values[0]);    
delete reinterpret_cast<float*>( values[1]);

free( values); // I'm not sure why this would have failed in your example, 
               //    but it would have leaked the 2 items that you allocated 
               //    with new

strは動的に割り当てられないため、解放しない (実際には解放できない)ことに注意してください。

いくつかのメモ:

  • あなたが持っているものはコンパイルされないので、これはsizeof(void) 意図されていたと思いますsizeof(void*)
  • 一般的に災害に備えたコードのように見えることを除いて、一見ランダムなキャストについては何も言うつもりはありません
于 2008-10-15T20:29:35.503 に答える
4

これは、boost::any クラスに最適な状況です。
また、独自のメモリを割り当てるのではなく、ベクトルを使用することを検討することもできます。

std::vector<boost::any>   data;
boost::any i1 = 1; // add integer
data.push_back(i1);

boost::any f1 = 1.0; // add double
data.push_back(f1);

data.push_back("PLOP"); // add a char *

std:: cout << boost::any_cast<int>(data[0]) + boost::any_cast<double>(data[1])
           << std::endl;

元のコードに戻ると、主な問題は次のとおりです。

values = (void*)calloc(3,sizeof(void));

// This should  have been
void** values = (void**)calloc(3,sizeof(void*));

// Freeing the members needs care as you need to cast them
// back to the correct type before you release the memory.

// now you can free the array with
free(values);

また、注意: 同じコードで new/delete と calloc/free の両方を使用することは違法ではありませんが、眉をひそめています。主な理由は、物事を混同しやすく、致命的になる可能性があるためです.

于 2008-10-15T21:09:18.700 に答える
1

newと*alloc()を混在させています。それはノーノーであり、未定義の結果につながる可能性があります。

于 2008-10-15T20:45:14.957 に答える
0

最初に呼び出された void* の数を追跡し、それらを繰り返し処理して、それぞれを解放してから、元の値変数を解放する必要があります。

くそフォーマット...(プレビューは正常に機能しています)。

int ct = 3;
values = (void*)calloc(ct,sizeof(void));
//can initialize values as: values = new void* [3];
int ival = 1;
float fval = 2.0;
char* str = "word";
values[0] = (void*)new int(ival);
values[1] = (void*)new float(fval);
values[2] = (void*)str;

for ( int i = 0; i < ct; i++ ) [
    delete( values[i] );
}
free( values );
于 2008-10-15T20:25:29.083 に答える
0

メモリ リークである values[0] と values[1] も削除していないことに注意してください。ただし、.data セクションへのポインタであるため、設計上、values[2] を解放することはできません。

于 2008-10-15T20:49:18.710 に答える
0

C で何かをしているのに、なぜ new を使用しているのかわかりません (タグ here を参照)。

必要な配列の個々の部分をmallocし、完了したらそれらを解放すると思います。最初に malloc しなかったものを解放することはできません。また、void ポインターを削除することもできません。

于 2008-10-15T20:28:00.513 に答える