Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Gcc5.3.0中调试和发布之间的奇怪行为 处境_C++_C++11_C++14 - Fatal编程技术网

C++ Gcc5.3.0中调试和发布之间的奇怪行为 处境

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

我在windows7上使用Mingw提供的gcc5.3.0和gtest来实现和运行单元测试

在我的项目中,我有一个计算机层次结构,它实现了界面
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
    ,对吗?