我对 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); } ;
我对 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); } ;
第一件事。以下陈述不是您想要的:
*PChar = NULL;
PChar=fnc(2);
您没有将 null 分配给指针,而是将值零 (0) 赋给所述缓冲区的第一个字符。你可能愿意这样做:
PChar = NULL;
PChar=fnc(2);
作为一种良好的编程习惯,是的,您应该在使用空指针后为其分配一个指针(并且可能已释放内存)。但是将指针分配给 null 不会释放内存 - 指针不会指向分配的内存,而是指向不存在的内存位置。delete
如果它是使用分配的,则需要new
调用,或者free
如果分配是由调用,则需要调用malloc
。
对于给定的语句,编译器无论如何都会删除以下语句,作为优化过程:
// PChar = NULL;
PChar=fnc(2);
使用指针时需要非常小心,并使用静态分配的数据或动态分配的缓冲区分配给它!
我建议声明一个 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 超出范围后释放是自动的。