C++ Gcc5.3.0中调试和发布之间的奇怪行为 处境
我在windows7上使用Mingw提供的gcc5.3.0和gtest来实现和运行单元测试 在我的项目中,我有一个计算机层次结构,它实现了界面C++ Gcc5.3.0中调试和发布之间的奇怪行为 处境,c++,c++11,c++14,C++,C++11,C++14,我在windows7上使用Mingw提供的gcc5.3.0和gtest来实现和运行单元测试 在我的项目中,我有一个计算机层次结构,它实现了界面Computer,如下所示: class Dataset; // Not // Interface Computer class Computer { public: // Destructor virtual to enable vmap virtual ~Computer() noexcept = default; // P
Computer
,如下所示:
class Dataset; // Not
// Interface Computer
class Computer {
public:
// Destructor virtual to enable vmap
virtual ~Computer() noexcept = default;
// Pure virtual fonctions
virtual bool preCompute(Dataset &datas) const = 0;
virtual void compute(Dataset &datas) const = 0;
};
我将此接口的抽象实现作为可链接计算机
,它实现了另一个接口(可链接
)和预计算机
的默认实现。见下文
class ChainableComputer : public Computer, public Chainable {
public:
bool preCompute(Dataset &dataset) const override;
};
这些类位于名为core
的命名空间中,并打包在core.dll中
在另一个dll中,我在另一个命名空间域中实现了chaineablecomputer
有些实现很简单,在预计算中没有任何事情要做,因此,它们以相同的方式实现计算:
class SomeComputerImpl : public ChainableComputer{
/// ...
void compute(Dataset &datas) const override final{
auto result = preCompute(datas);
if(!result){
throw;
}
}
};
这段代码正在传播,所以我决定重构并在计算机中添加一个受保护的方法:
class Computer {
/// ...
protected:
// Helper function for some implementations of Computer
void doPrecomputeOrThrow(Dataset &datas) const{
auto result = preCompute(datas);
if(!result){
throw;
}
}
}
我不希望此行为成为计算机的默认行为,但它使我有可能更改这些计算机的实现,如下所示:
class SomeComputerImpl : public ChainableComputer{
/// ...
void compute(Dataset &datas) const override final{
doPrecomputeOrThrow(Dataset &datas);
}
};
该软件在实际应用和单元测试中运行良好。。。如果我在发布模式下编译和运行
如果选择“调试”,编译工作正常,应用程序工作正常,但测试不起作用
我试着去理解它会发生什么,但我不知道什么是错的。我想这与链接器有关,接口、抽象实现和具体实现都在单独的DLL中,我们在另一个可执行文件中运行这些东西
我已经试过了
直接在测试中实现chaineablecomputer
=>按预期工作
在doPrecomputeOrThrow
=>上使用inline
或\uuuu属性(始终为inline)
,不起作用
在命名空间中实现doPrecomputeOrThrow
(将计算机*作为参数传递),在core.dll=>中没有效果
在namespace(将Computer*作为参数传递给domain.dll=>中实现doPrecomputeOrThrow
,工作正常
将doPrecomputeOrThrow
实现为类或命名空间中的模板,使用Computer
作为模板参数(见下文)=>工作正常
在类中将doPrecomputeOrThrow
实现为模板,将Dataset
作为模板参数(见下文)=>无效
//作为计算机
(静态或非静态)的成员工作的模板,或
//在命名空间中
模板
void doPrecomputerOrThrows(A计算机*c、数据集和数据集)
//作为计算机
模板
void dop重新计算行(ADataset和data)
问题
有人知道会发生什么?没有检查您的代码,但调试和发布中的不同行为几乎总是未定义行为的结果。尝试通过静态分析器、消毒剂或valgrind运行您的代码。这个问题将从一个好问题中受益匪浅。我同意@JasonR。一个可编译的例子会有很大的帮助。我不得不问:为什么要在Windows下使用GCC?这肯定会得益于调试器进入实际代码。但是你能在Windows下运行gdb吗?另外,正如建议的那样,您需要一个供我们评估的文件。我必须问一个明显的问题:在您以调试模式将应用程序链接到它们之前,您在调试模式下重新编译、链接并安装了core.dll
和domain.dll
,对吗?