0

我对 c++ 中的字符串内存使用有点困惑。

第二次将 *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);

您没有将 null 分配给指针,而是将值零 (0) 赋给所述缓冲区的第一个字符。你可能愿意这样做:

   PChar = NULL;
   PChar=fnc(2);

作为一种良好的编程习惯,是的,您应该在使用空指针后为其分配一个指针(并且可能已释放内存)。但是将指针分配给 null 不会释放内存 - 指针不会指向分配的内存,而是指向不存在的内存位置。delete如果它是使用分配的,则需要new调用,或者free如果分配是由调用,则需要调用malloc

对于给定的语句,编译器无论如何都会删除以下语句,作为优化过程:

 // 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 回答