我为单元测试类开发了一个小辅助函数,它使用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
变量?
非常感谢所有回复。
克里斯
答案 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 ++时 - 只需坚持new
和delete
。
答案 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]);