【发布时间】: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 风格的代码中,多次返回很容易导致清理操作无法正常进行。
标签: c++