将char *重新分配给null时释放内存

时间:2013-01-11 13:15:09

标签: visual-c++

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

好的重新分配* PChar第二次为空吗?将第一次分配到* 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); } ;

2 个答案:

答案 0 :(得分:0)

首先要做的事情。以下陈述不是您的意图:

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

您没有为指针指定null,而是将值0(0)置于所述缓冲区的第一个字符。你可能愿意这样做:

   PChar = NULL;
   PChar=fnc(2);

作为一个很好的编程习惯,是的,你应该在使用它之后指定一个指向null的指针(并且可能是内存释放)。但是将指针指定为null将不会释放内存 - 指针不会指向已分配的内存,而是指向不存在的内存位置。如果使用delete分配new,则需要致电free,如果malloc分配,则需要致电 // PChar = NULL; PChar=fnc(2);

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

{{1}}

使用指针时需要非常小心,并使用静态分配的数据或动态分配的缓冲区为其分配!

答案 1 :(得分:0)

我建议声明一个PChar类型的缓冲区,并在函数调用中将指针传递给该缓冲区。 良好的编程实践cals,用于传递应该在函数中检查的缓冲区的允许长度。

#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超出范围后发布是自动的。