0

C ++での文字列メモリの使用に関して、私は少し混乱しています。

2 回目に *PChar を NULL に再割り当てしてもよろしいですか? *PChar 文字列メモリに最初に割り当てられたメモリは解放されますか?

char * fnc(int g)
{
...
}

char *PChar = NULL;
PChar=fnc(1);
if (PChar) { sprintf(s,"%s",PChar); } ;

*PChar = NULL;
PChar=fnc(2);
if (PChar) { sprintf(s,"%s",PChar); } ;
4

2 に答える 2

0

まず最初に。次のステートメントは意図したものではありません。

*PChar = NULL;
PChar=fnc(2);

ポインターにヌルを割り当てているのではなく、上記のバッファーの最初の文字に値ゼロ (0) を入れています。あなたは喜んでするかもしれません:

   PChar = NULL;
   PChar=fnc(2);

良いプログラミングの実践として、はい、使用後に null へのポインターを割り当てる必要があります (およびメモリの割り当てが解除される可能性があります)。ただし、ポインタを null に割り当ててもメモリは解放されません。ポインタは割り当てられたメモリではなく、存在しないメモリ位置を指します。deleteを使用して割り当てられた場合は呼び出す必要があり、によって割り当てられた場合newは呼び出す必要があります。freemalloc

指定されたステートメントに関しては、コンパイラーは、最適化のプロセスとして、次のステートメントをとにかく削除します。

 // PChar = NULL;
 PChar=fnc(2);

ポインタを使用し、静的に割り当てられたデータまたは動的に割り当てられたバッファを使用してポインタに割り当てるときは、非常に注意する必要があります!

于 2013-01-12T08:17:50.363 に答える
0

PChar 型のバッファーを宣言し、関数呼び出しでこのバッファーへのポインターを渡すことをお勧めします。関数でチェックする必要があるバッファの許容長も渡すための優れたプログラミング プラクティス。

#define MAX_PCHAR_LEN 1024 // or constant const DWORD . . .

PChar PCharbuf[MAX_PCHAR_LEN] = {0}; // initialize array with 0s

//make a call
fnc (&PCharbuf, MAX_PCHAR_LEN, 2); // whatever 2 means

この方法では、PCharbuf が範囲外になった後に解放が自動的に行われるため、誰がメモリを割り当て、誰が解放したかを気にする必要はありません。

于 2013-01-12T17:14:44.843 に答える