单元测试ASSERT_EQ断言时指针指向内存地址而非对象的问题
单元测试ASSERT_EQ报错分析
问题场景
运行单元测试代码:
ASSERT_EQ(mifid_trade_report.contingent_transaction_flag, "CONT");
得到错误输出:
/home/.../test_protocol.cpp:2075: Failure Expected equality of these values: mifid_trade_report.contingent_transaction_flag Which is: "CONT" Which is: 0x563717b6bffe
问题1解答
你的理解有误。错误信息的实际含义是:
mifid_trade_report.contingent_transaction_flag的值为空(显示为空行,说明是未初始化的指针或空指针)"CONT"是C++字符串字面量,会被隐式转换为const char*类型,0x563717b6bffe是该字符串字面量在内存中的存储地址。
ASSERT_EQ在此处执行的是指针地址的比较,而非字符串内容的比较。
问题2解答
显示内存地址的核心原因是比较的是指针而非字符串内容:
- 如果
contingent_transaction_flag是std::string类型,ASSERT_EQ会调用字符串的重载比较运算符,直接对比内容;但从错误信息看,它的类型大概率是const char*,且未正确初始化(为空指针或野指针)。 - 其他测试正常,是因为那些测试中对应的变量要么是
std::string类型,要么是已正确指向有效字符串的const char*指针,而当前测试里的contingent_transaction_flag未被正确赋值,导致指针为空。
修复建议:如果是C风格字符串,改用ASSERT_STREQ来比较内容;如果是std::string类型,检查contingent_transaction_flag是否被正确初始化或赋值。
内容的提问来源于stack exchange,提问作者kfsopdf
相关产品推荐
相关产品推荐

