使用unique_ptr时GMock的EXPECT_CALL触发崩溃,求原因分析
这问题我太熟了,咱们直接揪出代码里的关键问题——你的unique_ptr根本没指向实际的对象!
崩溃的核心原因
看你Server_Fixture的SetUp方法:
void SetUp() override { mock = std::unique_ptr<TestMock>(); }
这行代码只是创建了一个空的unique_ptr(内部指针是nullptr),并没有实际分配TestMock对象。当你在TEST_F里调用getMock()时,返回的是*mock——也就是对nullptr的解引用,这属于C++里的未定义行为,直接触发段错误完全在意料之中。
修复方案
把SetUp里的初始化改成实际创建对象就好,推荐用std::make_unique(C++14及以上支持),比直接用new更安全:
void SetUp() override { mock = std::make_unique<TestMock>(); }
如果是C++11的环境,也可以这样写:
void SetUp() override { mock.reset(new TestMock()); }
这样unique_ptr就会指向一个真正构造好的TestMock实例,getMock()返回的引用就是有效的了。
为什么本地对象不会崩溃?
当你在TEST_F里创建本地TestMock对象时,比如:
TEST_F(Server_Fixture, execute) { TestMock local_mock; EXPECT_CALL(local_mock, test()).WillRepeatedly(Invoke(doNothing)); }
这个local_mock是在栈上实际构造的对象,内存是有效的,自然不会出现解引用空指针的问题。
内容的提问来源于stack exchange,提问作者HAL9000
相关产品推荐
相关产品推荐

