我对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); } ;
答案 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超出范围后发布是自动的。