从函数返回堆char指针的问题

时间:2014-04-25 19:32:22

标签: c++

此代码有效:


        char* CFichierTrace::ConvertBSTRToString(BSTR* str)
        {
           if ( str == NULL )
           {
              char* buf = new char[2];
              sprintf_s(buf, 2, "%s", "");

              return buf;
           }
           else
              return _com_util::ConvertBSTRToString(*str);

        }

但是我试图避免多次返回,我被告知编程错误。然而,它不会工作:



        char* CFichierTrace::ConvertBSTRToString(BSTR* str)
        {
           // char* result = new char[1];  (attempt #1, produces garbage as output)
           char* result = (char*) malloc(1 *sizeof(char)); (attempt #2, more garbage as output)

           if ( str == NULL )
           {
              char* buf = new char[2];
              sprintf_s(buf, 2, "%s", "");

              result = buf;
           }
           else
              result = _com_util::ConvertBSTRToString((BSTR) str);

          return result;

        }

有一篇文章关于将字符串作为char **返回参数(通过ref),但是我不明白为什么不能返回堆中的char *?

3 个答案:

答案 0 :(得分: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;
    }

答案 1 :(得分:2)

   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 :(得分:2)

我只是假设您知道为什么您将指针传递给BSTR而不是BSTR。

char* CFichierTrace::ConvertBSTRToString(BSTR* str) {
    return _com_util::ConvertBSTRToString(*str);
}

由于BSTR - 语义,这是正确的实现 为了澄清,所有适当的BSTR - 函数都将NULL视为与0长BSTR相同。

无论如何,在任何有意义的地方使用多个返回点,除非你的编码标准不符合这一点。