Gtest和Gmock - 双重释放或损坏

3

我曾花费很多时间来解决这个问题,但一直没有成功。首先是我的配置:Ubuntu 16.04.1,qmake 3.0,cmake 3.5.1,共享的gtest和gmock库,版本1.8.0。我使用Qt Creator,以下是一个导致崩溃的最小程序示例。

main.cpp:

#include <iostream>
#include <gtest/gtest.h>
#include <gmock/gmock.h>

using namespace std;

class A {
    void print() {
        std::cout << "PRINT" << std::endl;
    }
};

class B: public A {
    MOCK_METHOD0(print, void());
};

TEST(MOCK, TEST) {
    B b;
}

int main(int argc, char *argv[])
{
    ::testing::InitGoogleTest(&argc, argv);
    return RUN_ALL_TESTS();
}

google_test.pro:

TEMPLATE = app
CONFIG += console c++11
CONFIG -= app_bundle
CONFIG -= qt

SOURCES += main.cpp

LIBS += -lgtest -lgmock

测试通过,但在程序结束时,我遇到了这个错误:

* 错误:在“/home/aminought/QtProjects/build-google_test-Desktop_Qt_5_7_0_GCC_64bit-Debug/google_test”中的双重释放或破坏(!prev):0x0000000001a51270 *

如何解决这个错误?非常烦人。


我已经执行了你的代码,没有出现那个错误。gtest 1.8.0.1,gmock 1.8.0.1,QMake 版本 3.0,Qt 版本 5.7.1,cmake 3.7.1.1。 - eyllanesc
升级到cmake 3.7.1和g++ 5.4.1。现在错误看起来是这样的: *** 在“/home/aminought/QtProjects/build-google_test-Desktop_Qt_5_7_0_GCC_64bit-Debug/google_test”中的错误:free():无效指针:0x0000000001864fb0 *** - logumanov
升级到6.2.0版本,没有任何变化。 - logumanov
还可以尝试将MOCK_METHOD0放在模拟类的公共部分。 - Henrique Jung
我无法使用clang 6.0重现您的问题,同时在Valgrind下运行它也没有产生任何错误。 - Henrique Jung
显示剩余2条评论
3个回答

4
这个问题只出现在使用共享库编译的谷歌测试中。我不知道为什么,但是将共享库替换为静态库可以解决这个问题。

这听起来像是在构建库时编译标志不同。 - Rudi
1
只有-DBUILD_SHARED_LIBS=ON - logumanov

1
这篇文章已经发布几年了。我无法复制您遇到的确切问题,但最近我在不同的情境下遇到了相同的错误信息。
问题是,我故意重写了TearDown(),释放了一个fixture类的受保护成员,这导致指针被双重释放。似乎googletest正在跟踪分配的内存并尝试自动释放所有内容,即使我的TearDown()重写已经先前执行了释放操作。删除重写后,问题得到解决。
希望对未来的某个人有用。
在我的情况下,动态链接没有任何影响。

0
经过对gtest_discover_tests的一些阅读,似乎在某些平台上,如果不了解可执行文件的性质,就无法进行测试的发现。 因此,我不得不改变了测试发现的模式。
在我的情况下,将'DISCOVERY_MODE PRE_TEST'传递给gtest_discover_tests cmake函数解决了这个问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接