15

関数でmallocを使用して配列を返そうとしています:

char* queueBulkDequeue(queueADT queue, unsigned int size)
{
    unsigned int i;
    char* pElements=(char*)malloc(size * sizeof(char));
    for (i=0; i<size; i++)
    {
        *(pElements+i) = queueDequeue(queue);
    }
    return pElements;
}

問題は、MCU のヒープ サイズが限られているため、解放する必要があることです。しかし、私はそれを返したいので、関数でそれを解放することはできませんよね?. 関数の外側 (関数を呼び出す場所) に割り当てられたメモリを解放できますか? これに関するベストプラクティスはありますか? 前もって感謝します!

4

4 に答える 4

10

malloc() によって割り当てられたメモリはスタック上ではなくヒープ上にあるため、どの関数を使用していてもアクセスできます。malloc() されたメモリを渡したい場合は、解放する以外に選択肢はありません発信者からです。(参照カウントの用語では、これは所有権の譲渡と呼ばれるものです。)

于 2012-08-01T04:37:35.840 に答える
10

1) はい、関数外で malloc されたメモリを free() することができます

2)いいえ、関数内で解放してデータを関数外に渡すことはできないため、1)ここで行う必要があります

3) メモリ不足が心配な場合は、常にメモリ割り当ての失敗をチェックする必要があります。

于 2012-08-01T04:04:39.317 に答える
9

もちろん、関数を返す場合は、その関数の外部にある関数で割り当てられたメモリを解放できます。

ただし、代わりに、呼び出し元がメモリの割り当てと解放のみを行う以下のように関数を変更することもできます。これは、メモリを割り当てる関数がメモリを解放する責任を負うという概念と一致します。

void queueBulkDequeue(queueADT queue, char *pElements, unsigned int size) 
{     
   unsigned int i;     
   for (i=0; i<size; i++)     
   {         
      *(pElements+i) = queueDequeue(queue);     
   }     
   return; 
} 

//呼び出し元で

char *pElements = malloc(size * sizeof(char));
queueBulkDequeue(queue, pElements, size);
//Use pElements
free(pElements);
于 2012-08-01T04:29:56.710 に答える
5

はい、関数の外部で呼び出す関数に割り当てられたメモリを解放できます。これは、まさにこの場合に行う必要があることです。

代替手段には、バッファーとその長さを関数に渡し、実際の長さを呼び出し元に返すことfgetsが含まれます。呼び出し元はループ内で関数を呼び出す必要があるため、これは最良の代替手段ではない可能性があります。

于 2012-08-01T04:04:30.660 に答える