静态成员初始化在调试和释放模式下在一个特定环境中的工作方

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了静态成员初始化在调试和释放模式下在一个特定环境中的工作方相关的知识,希望对你有一定的参考价值。

我正在使用C ++ 14.而且我有一些静态类成员。伪代码:

Class Zoo
{
      Eigen::Array<float, Eigen::Dynamic, Eigen::Dynamic> _matrix;

      Zoo()
      {
        _matrix.resize(6, 6)
      }
}

Class Foo
{
   static Zoo _member;
}

我应该说我有很多单元测试,覆盖率很高。编译此代码并在发布和调试(x64)中的一个env中正常工作。 VS 2016.在其他env(也在那里使用VS 2016编译)它在调试模式下工作,在发布时我在_matrix.resize(6, 6)初始化期间获得了访问冲突读取位置0xFFFFFFFFFFFFFFFF。在另一种情况下,我在初始化期间也在其他地方初始化期间也遇到了堆损坏。我已经多次重建解决方案,手动清理VS构建文件夹,尝试过MS和Intel编译器,重新启动windows :)我无法理解相同的代码是如何工作在调试而不是在发布中,并且工作在在另一个环节上发布。这如何影响静态成员初始化?由于发布模式,我无法正常调试。我应该说我在我的项目中使用Eigen lib,我认为这可能发生,因为Eigen在发布模式下使用向量化和编译器内在函数,并且可能它可以编译为在不同env上设置的不同指令,但仍然不明白这怎么会影响静态成员初始化。这种行为不断复制,而不是不时复制。

答案

我找到了“理由”和解决方法,但从技术上讲,我没有看到任何意义:

我还有一个静态类StreamReader,它有几个静态函数,它们从ifstream反序列化值,没有任何字段:

StreamReader
{
    static int ReadInt(ifstream& in);
}

int StreamReader::ReadInt(ifstream& in)
{
     int curInt;
     in.read((char*)(&curInt), sizeof(int));
     return curInt;
}

我打过电话:

ifstream in(_dataPath, ios::in | std::ios::binary);
int cols = StreamReader::ReadInt(in);
int rows = StreamReader::ReadInt(in);

之前:

_matrix.resize(cols, rows).

我从ReadInt()中删除了static关键字。并将代码更改为

ifstream in(_dataPath, ios::in | std::ios::binary);
StreamReader ser;
int cols = ser.ReadInt(in);
int rows = ser.ReadInt(in);

现在所有都在调试和发布中工作。一些废话。不知道为什么这有帮助,但我得出了一个结论:避免使用静力学。

以上是关于静态成员初始化在调试和释放模式下在一个特定环境中的工作方的主要内容,如果未能解决你的问题,请参考以下文章

C++类中的静态成员函数以及静态成员变量

C++类中的静态成员函数以及静态成员变量

Google标记管理器-默认情况下在环境中显示调试栏?

变量静态的和单例模式

处于释放模式时,C ++向量未初始化为空

关于纯抽象类中的静态成员函数 - 设计模式?