从函数返回堆字符指针的问题
Posted
技术标签:
【中文标题】从函数返回堆字符指针的问题【英文标题】:Issue with returning a heap char pointer from a function 【发布时间】:2014-04-25 19:32:21 【问题描述】:此代码有效:
char* CFichierTrace::ConvertBSTRToString(BSTR* str) 如果(str == NULL) 字符* buf = 新字符[2]; sprintf_s(buf, 2, "%s", ""); 返回缓冲区; 别的 返回 _com_util::ConvertBSTRToString(*str);但我试图避免多次退货,有人告诉我编程不好。但是它不起作用:
char* CFichierTrace::ConvertBSTRToString(BSTR* str) // char* 结果 = new char[1]; (尝试#1,产生垃圾作为输出) char* 结果 = (char*) malloc(1 *sizeof(char)); (尝试#2,更多垃圾作为输出) 如果(str == NULL) 字符* buf = 新字符[2]; sprintf_s(buf, 2, "%s", ""); 结果 = buf; 别的 结果 = _com_util::ConvertBSTRToString((BSTR) str); 返回结果;有一篇关于在参数中将字符串作为 char** 返回的文章(通过 ref),但我不明白为什么无法返回堆中的 char* ?
【问题讨论】:
为什么不使用std::string
?绝对应该避免在此处使用malloc
,并像在第一个示例中那样选择使用new
。
多次回报是糟糕的编程是一个神话。
多次退货绝对没有错。
我的代码正在运行。我编码((BSTR)str)而不是(*str)。感谢您的快速解答!
@RobK:在 C++ 风格的编程中,所有代码都必须能够处理早期返回,特别是通过异常。这意味着多个普通回报是没有问题的。然而,在 C 风格的代码中,多次返回很容易导致清理操作无法正常进行。
【参考方案1】:
char* CFichierTrace::ConvertBSTRToString(BSTR* str)
char* ret;
if ( str == NULL )
ret = new char[1];
ret[0] = 0;
else
ret = _com_util::ConvertBSTRToString(*str);
return ret;
顺便说一句,您不应该将 C++ new
与 C malloc
混合使用。
此外,可以说多个返回点是一种不好的做法。当您有多个返回点时,有很多情况下代码更具可读性。
【讨论】:
【参考方案2】:你会这样做:
char* CFichierTrace::ConvertBSTRToString(BSTR* str)
char* buf;
if ( str == NULL )
buf = new char[2];
sprintf_s(buf, 2, "%s", "");
else
buf = _com_util::ConvertBSTRToString(*str);
return buf;
【讨论】:
【参考方案3】:我只是假设您知道为什么您将指针传递给 BSTR,而不是 BSTR。
char* CFichierTrace::ConvertBSTRToString(BSTR* str)
return _com_util::ConvertBSTRToString(*str);
由于BSTR
-semantics,这是正确的实现。
澄清一下,所有正确的 BSTR
函数都将 NULL
视为 0 长度的 BSTR
。
无论如何,只要有意义,就使用多个返回点,除非您的编码标准不正确,不允许这样做。
【讨论】:
+1 迄今为止唯一合理的答案。我认为它已经过测试。以上是关于从函数返回堆字符指针的问题的主要内容,如果未能解决你的问题,请参考以下文章
C 语言字符串 一级指针 内存模型 ( 指定大小字符数组 | 未指定大小字符数组 | 指向常量字符串的指针 | 指向堆内存的指针 )