2

テンプレート関数内には、次のコードがあります。

TypeName myFunction()
{

    TypeName result;
    void * storage = malloc( sizeof( TypeName ) );

    /*Magic code that stores a value in the space pointed to by storage*/

    result = *(TypeName *)storage;

    free( storage );
    return result;
}

これにより、「HEAP CORRUPTION DETECTED」エラーが発生します。free() 関数を呼び出さない場合、エラーは発生しませんが、メモリ リークが発生しているのではないかと心配しています。 「ストレージ」の値を取得してから、メモリの割り当てを解除しますか?

4

5 に答える 5

3

storageを割り当てる必要はありません。おそらく、結果変数を魔法のような機能を実行する関数に渡すことができます。このようなもの。

void magic(void *buffer)
{
  // magic stuff 
}

TypeName foo()
{
   TypeName result;
   magic(&result);
   return result;
}

またはもちろん、TypeName 構造体をビットフィールドまたはマジック コードで操作するものとして設定することもできます...

于 2010-03-03T17:34:27.503 に答える
2

次のように呼ばないでください:

TypeName result;
void * storage = malloc( 4 );

あなたはそれを呼び出す必要があります

TypeName result;
void * storage = malloc( sizeof(TypeName) );

とにかくコードは奇妙に見えます:)

于 2010-03-03T17:30:42.317 に答える
1

どうですか:

TypeName myFunction() {
    TypeName result;
    void* storage = &result;

    /*Magic code that stores a value in the space pointed to by storage*/

    return result;
}

ここでは、すべての変数がスタックに格納されるため、ヒープ関連の問題が発生することはありません(「魔法の」コードの機能によって異なります)。

storageアレイをとは別にする理由はありますresultか?結果を単純ににコピーする場合は、result1つのオブジェクトのみを使用する(そして、必要に応じてオブジェクトへのvoid*ポインターを保持するか、型キャストする)方が理にかなっています(IMHO &result)。

storage別のandを使用する理由がある場合は、andの代わりにandresultを使用するとマイレージが向上する可能性があります。TypeName storage = new TypeNamedeletemalloc(4)free

于 2010-03-03T18:32:00.420 に答える
1

あなたの混乱は次の行にあると思います:

 void * storage = malloc( 4 );

4 バイトのポインターにスペースを割り当てようとしているように見えますが、それは必要なことではありません。行を 2 つのステップに分けてみましょう。

void * storage;          // This allocates 4 bytes for a variable of type "pointer to void"
storage = malloc( 4 );   // This allocates 4 _more_ bytes and sets "storage" to their address.

「魔法の」コードが、型の変数から、この効果Typenameで割り当てられたメモリにデータをコピーすると仮定しています。storage

memcpy(storage, data_from_a_Typename_variable, sizeof(Typename));

したがって、sizeof(Typename)割り当てられた 4 バイトよりも大きい場合はstorage、ヒープ破損エラーが表示されます。

Typename他の回答が示すように、次のように、変数に十分なスペースを割り当てる必要があります。

void * storage = malloc(sizeof(Typename));

しかし、Liz AlbinTypenameが示唆したように、すでにin用のスペースを割り当てているので、マジック関数に渡すか、またはresult渡すのが簡単です。&result(void *) &result

于 2010-03-03T17:51:59.527 に答える
0

なぜmalloc4 バイトで、まだ の型名にキャストしたのTypeNameですか? それは間違いなく奇妙に見えます!

他の答えは、それが何であるかを示唆しています...!

これがお役に立てば幸いです。よろしくお願いします、トム。

于 2010-03-03T17:36:33.193 に答える