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

问题描述 投票:0回答:1

我正在使用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上设置的不同指令,但仍然不明白这怎么会影响静态成员初始化。这种行为不断复制,而不是不时复制。

c++ visual-studio static eigen
1个回答
0
投票

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

我还有一个静态类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);

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

© www.soinside.com 2019 - 2024. All rights reserved.