You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 13:22:44