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

标签: 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 迄今为止唯一合理的答案。我认为它已经过测试。
      猜你喜欢
      • 2011-01-21
      • 1970-01-01
      • 2012-11-12
      • 2014-08-03
      • 1970-01-01
      • 2015-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多