首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从C++中的函数返回字符串指针

从C++中的函数返回字符串指针
EN

Stack Overflow用户
提问于 2012-03-15 03:58:12
回答 2查看 803关注 0票数 2

下面是我的代码:

代码语言:javascript
复制
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

功能:

代码语言:javascript
复制
TCHAR *GetValueFromFile(TCHAR *sFilename,TCHAR *sDept,TCHAR *sNames)
{
...
}

哪种做法是正确的?#1还是#2?

谢谢大家。编辑#1:

我在.cpp文件中使用VS2008,但实际上只是在C代码中使用。

我只需要在GetValueFromFile中打开一个文件,然后将返回的字符串发回。我是否应该在GVFF中分配内存并在我的程序中释放它?

代码语言:javascript
复制
main()
{
TCHAR *sResult;
DWORD dwRetVal = GetValueFromFile(sFile,L"Dept",L"Name", &sResult);
...
free(sResult);sResult=NULL;
}

是像这样吗?

代码语言:javascript
复制
DWORD GetValueFromFile(TCHAR *sFilename,TCHAR *sDept,TCHAR *sNames, TCHAR ** sValueData)
{
dwL = GetStringDataLength(…)
*sValueData = (TCHAR *) calloc(dwL+1, sizeof(TCHAR));
_tcscpy_s(sValueData,dwL,sDataFromFile);
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-03-15 04:02:46

首先,在第一种情况下,这是不必要的,并且会导致一个问题:

代码语言:javascript
复制
TCHAR *sResult = (TCHAR *) calloc(16384+1, sizeof(TCHAR));

我不知道16384+1是从哪里来的,所以我现在假设这是“正确的”,但是您可以继续将指针设置为下一行中的另一个值。我的朋友,这是内存泄漏。为什么要分配不需要的内存?

您的问题实际上可以归结为GetValueFromFile的实现。如果该函数返回一个指针(它确实返回了),那么它肯定应该是一个有效的指针,并且您负责释放它(可能是。同样,这取决于实现)。

除非您确实需要副本,否则不需要创建副本。从你给我们的信息中没有“对”或“错”,我们需要知道GetValueFromFile的详细信息。

根据您的编辑:

该函数不返回任何内容。完全没有。它的签名说明它返回一个DWORD,而不是一个TCHAR*。它显然与你的第一个例子不同,因为它将指针初始化为输出参数(第四个),但这不是你在原始例子中调用它的方式。

我现在更困惑了,但是如果函数初始化了指针,那么你只需要声明(函数外部没有内存分配)指针并传入它的地址。

给定的

代码语言:javascript
复制
DWORD GetValueFromFile(TCHAR *sFilename,TCHAR *sDept,TCHAR *sNames, TCHAR ** sValueData)

那么传递指针的正确方式是:

代码语言:javascript
复制
TCHAR *result;
GetValueFromFile(filename, dept, names, &result);

该函数将result变量初始化为指向有效位置。不要忘记,您现在要负责回收它!

票数 2
EN

Stack Overflow用户

发布于 2012-03-15 04:05:15

1显然是不正确的。首先使用calloc分配空间,然后使用GetValueFromFile的返回覆盖指向该空间的指针。假设没有将指针保存在其他地方的干预代码,这意味着您不再能够访问您分配的内存,因此您不能再访问或释放它。简而言之,这是一个巨大的内存泄漏。

根据GetValueFromFile如何分配返回指针的内存,#2可能同样糟糕,但您发布的代码并没有告诉我们足够多的信息。如果它返回类似于指向静态分配的缓冲区的指针,那么它很可能是正确的(对于正确的定义而言)。如果它使用malloccalloc之类的东西来分配空间,并期望客户端代码在需要时释放空间,那么它就会遇到类似于#1中的问题。

请注意,“对于正确的定义”基本上是这样的:“如果你有多个线程,或者任何需要重入的时候,你就错了”。鉴于目前多核和多处理器系统的普遍存在,这个定义现在非常狭窄,而且一直在变得越来越窄。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9709316

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档