析构函数中的模拟总线错误
GMock bus error in destructor
我有以下类:
class D1;
class D2;
class Base
{
Public:
Base();
virtual ~Base() { if (instance) delete instance; }
static Base* GetInstance();
virtual int Get() = 0;
virtual int Set(const int val) = 0;
private:
static Base* instance;
};
Base *Base::instance = nullptr;
Base* Base::GetInstance()
{
if (some_condition)
return new D1;
else
return new D2;
}
class D1 : public Base
{
public:
...
virtual int myD1Method()
{
...
}
int Get()
{
...
}
int Set(const int val)
{
...
}
private:
// members...
};
class D2 : public Base
{
public:
...
int Get()
{
...
}
int Set(const int val)
{
...
}
private:
// members...
};
为了测试D1类,我使用google mock框架创建了一个模拟类,如下所示:
class MockD1 : public D1
{
protected:
using D1::MyD1Method;
MockD1() : base(Base::GetInstance()) {}
MOCK_METHOD0(MyD1Method, int())
private:
Base *base;
};
TEST(MockTest, TestD1)
{
MockD1 md1;
EXPECT_CALL(md1, MyD1Method()).WillRepeatedly(Return(10));
EXPECT_EQ(md1.Set(10), NO_ERROR);
EXPECT_EQ(md1.Get(), 10);
}
测试似乎工作良好。然而,我在测试结束时得到一个总线错误。当我在gdb中逐步执行时,它看起来好像在基类析构函数中陷入循环,并最终导致总线错误。我会感激任何输入我做错了什么。
这个析构函数的问题是:
virtual ~Base() { if (instance) delete instance; }
和GMock没有关系。
delete instance
调用Base::~Base()
- Base::~Base()
调用delete instance
-这就是您正在观察的无限循环。
正确的解决方案是不使用单例。你可以用工厂代替。
你也可以尝试在删除instance之前取消它——这应该可以工作——但仍然——Base的每个实例都是Base::instance的所有者(即控制其生命周期)不是好的设计:
virtual ~Base()
{
Base* instanceToDelete = instance;
instance = nullptr;
if (instanceToDelete) delete instanceToDelete;
}
相关文章:
- 总线错误,堆上分配的内存
- 总线错误 10 - 字符 * 数组
- C/C++ 字符串错误与 ARM SEG 故障总线错误
- 获取总线错误:10 并附加字符串
- 多维矢量总线错误
- 链表的总线错误(核心转储)
- C 结构中的总线错误
- 如何解决此总线错误
- 调用虚拟方法导致总线错误
- 尝试打印数组时出现总线错误和奇怪的输出
- 尝试在共享内存中写入时发生总线错误
- C++ 总线错误:尝试解析和更新字符串时出现 10
- 我在以下代码中收到总线错误
- 总线错误:10 还有更多索引要去
- 使用链表的动态队列//总线错误:10(C++)
- 快速修复程序给出的总线错误
- 总线错误10或分段错误11
- C++ 在类成员"无符号长"上使用"^="和"<<"时出现总线错误
- 析构函数中的模拟总线错误
- 试图获取vector迭代器的值时出现总线错误10