下面是我的代码:
TCHAR *sResult = (TCHAR *) calloc(16384+1, sizeof(TCHAR));
sResult = (TCHAR *) GetValueFromFile(sFilename,L"Dept",L"Names"); // #1
_tcscpy(sResult,(TCHAR *) GetValueFromFile(sFilename,L"Dept",L"Names"); // #2功能:
TCHAR *GetValueFromFile(TCHAR *sFilename,TCHAR *sDept,TCHAR *sNames)
{
...
}哪种做法是正确的?#1还是#2?
谢谢大家。编辑#1:
我在.cpp文件中使用VS2008,但实际上只是在C代码中使用。
我只需要在GetValueFromFile中打开一个文件,然后将返回的字符串发回。我是否应该在GVFF中分配内存并在我的程序中释放它?
main()
{
TCHAR *sResult;
DWORD dwRetVal = GetValueFromFile(sFile,L"Dept",L"Name", &sResult);
...
free(sResult);sResult=NULL;
}是像这样吗?
DWORD GetValueFromFile(TCHAR *sFilename,TCHAR *sDept,TCHAR *sNames, TCHAR ** sValueData)
{
dwL = GetStringDataLength(…)
*sValueData = (TCHAR *) calloc(dwL+1, sizeof(TCHAR));
_tcscpy_s(sValueData,dwL,sDataFromFile);
}发布于 2012-03-15 04:02:46
首先,在第一种情况下,这是不必要的,并且会导致一个问题:
TCHAR *sResult = (TCHAR *) calloc(16384+1, sizeof(TCHAR));我不知道16384+1是从哪里来的,所以我现在假设这是“正确的”,但是您可以继续将指针设置为下一行中的另一个值。我的朋友,这是内存泄漏。为什么要分配不需要的内存?
您的问题实际上可以归结为GetValueFromFile的实现。如果该函数返回一个指针(它确实返回了),那么它肯定应该是一个有效的指针,并且您负责释放它(可能是。同样,这取决于实现)。
除非您确实需要副本,否则不需要创建副本。从你给我们的信息中没有“对”或“错”,我们需要知道GetValueFromFile的详细信息。
根据您的编辑:
该函数不返回任何内容。完全没有。它的签名说明它返回一个DWORD,而不是一个TCHAR*。它显然与你的第一个例子不同,因为它将指针初始化为输出参数(第四个),但这不是你在原始例子中调用它的方式。
我现在更困惑了,但是如果函数初始化了指针,那么你只需要声明(函数外部没有内存分配)指针并传入它的地址。
给定的
DWORD GetValueFromFile(TCHAR *sFilename,TCHAR *sDept,TCHAR *sNames, TCHAR ** sValueData)那么传递指针的正确方式是:
TCHAR *result;
GetValueFromFile(filename, dept, names, &result);该函数将result变量初始化为指向有效位置。不要忘记,您现在要负责回收它!
发布于 2012-03-15 04:05:15
1显然是不正确的。首先使用calloc分配空间,然后使用GetValueFromFile的返回覆盖指向该空间的指针。假设没有将指针保存在其他地方的干预代码,这意味着您不再能够访问您分配的内存,因此您不能再访问或释放它。简而言之,这是一个巨大的内存泄漏。
根据GetValueFromFile如何分配返回指针的内存,#2可能同样糟糕,但您发布的代码并没有告诉我们足够多的信息。如果它返回类似于指向静态分配的缓冲区的指针,那么它很可能是正确的(对于正确的定义而言)。如果它使用malloc或calloc之类的东西来分配空间,并期望客户端代码在需要时释放空间,那么它就会遇到类似于#1中的问题。
请注意,“对于正确的定义”基本上是这样的:“如果你有多个线程,或者任何需要重入的时候,你就错了”。鉴于目前多核和多处理器系统的普遍存在,这个定义现在非常狭窄,而且一直在变得越来越窄。
https://stackoverflow.com/questions/9709316
复制相似问题