C ++函数返回const char *

时间:2012-03-22 09:42:12

标签: c++ string pointers malloc const

我为单元测试类开发了一个小辅助函数,它使用vector<unsigned char>并将其转换回const char *。我写了这个,所以我可以将它传递给gtest的ASSERT_STREQ宏进行简单的比较。这是:

const char * convertVecToChar(std::vector<unsigned char>& source)
{
    std::vector<unsigned char>::size_type size = source.size();
    char* data = (char*)malloc(sizeof(char) * (size + 1)); 
    memcpy(data, &source[0], size);
    data[size] = 0;
    return data;
}

这是一个被称为的例子:

ASSERT_STREQ("de", convertVecToChar(somevector));

我认为这是泄漏的,但我打电话给malloc,但没有再打电话给delete了吗?

是否有一种更优雅的方法可以执行此操作,而不是每次在测试方法中调用const char *时都不会创建单独的ASSERT_STREQ变量?

非常感谢所有回复。

克里斯

5 个答案:

答案 0 :(得分:11)

返回std::string而不是char*malloc()new,不需要):

std::string convertVecToChar(std::vector<unsigned char>& source)
{
    return std::string(source.begin(), source.end());
}

并使用:

ASSERT_STREQ("de", convertVecToChar(somevector).c_str());  

答案 1 :(得分:2)

重载operator==,然后您可以使用ASSERT_EQ:

bool operator==(const char* nullTerminatedChars,
                const std::vector<char>& vecChars)
{
    return std::string(nullTerminatedChars) ==
           std::string(vecChars.begin(), vecChars.end());
}

用作:

std::vector<char> chars;
ASSERT_EQ("de", chars);

你也需要重载operator<<(std::ostream& ...,因为如果断言失败,GoogleTest会使用它将断言的参数转换为错误消息。

编辑:

std::ostream& operator<<(std::ostream& os, const std::vector<char>& chars)
{
    return os << std::string(chars.begin(), chars.end());
}

答案 2 :(得分:1)

您应该只使用string容器 - 无需担心内存泄漏。

顺便说一句 - 当您使用C ++时 - 只需坚持newdelete

答案 3 :(得分:1)

source.push_back(0);
ASSERT_STREQ("de", (char*)&source[0]);
source.pop_back();

答案 4 :(得分:0)

我也建议使用std :: string,但我想知道,为什么不只是比较矢量的内容?您可以通过&source[0]访问原始数据,以便执行以下操作:

ASSERT_STREQ("de", (char*)&source[0]);