首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SIGFPE与std无序映射

SIGFPE与std无序映射
EN

Stack Overflow用户
提问于 2019-01-15 09:14:32
回答 2查看 269关注 0票数 0

下面是一个简单的应用程序,如果我取消对main.cc中提到的行的注释,它将为我带来SIGFPE。

config.h

代码语言:javascript
复制
#ifndef SRC_CONFIG_H_
#define SRC_CONFIG_H_

#include <cstdint>
#include <unordered_map>
#include <string>
#include <tuple>
#include <vector>

using ConfigTable_t = std::unordered_map<uint16_t, std::tuple<std::string, std::vector<uint8_t> > >;

static const ConfigTable_t gTable1 {
  { 0x100, std::make_tuple( "table1", std::vector<uint8_t> { 5,5,5,5,5,5 } ) }
};

static const ConfigTable_t gTable2 {
  { 0x200, std::make_tuple( "table2", std::vector<uint8_t> { 0,1,2,3,4,5 } ) }
};

const ConfigTable_t & getConfigTable();

#endif

table_provider.cc

代码语言:javascript
复制
#include "config.h"

const ConfigTable_t & getConfigTable() {
    return gTable1;
}

main.cc

代码语言:javascript
复制
#include "config.h"

static const uint16_t gId = 0x100;
// static const std::string gName = std::get<0>(getConfigTable().at(gId)); //  <-- Doesn't work
static const std::string gName = std::get<0>(gTable1.at(gId));             //  <-- Works  

int main() {
  return 0;
}

https://stackoverflow.com/a/36406774/3884862中有一个与这个问题相关的指针,但我不知道为什么会发生这种情况。

我用

g++ -std=c++14 main.cc table_provider.cc -o试验

g++ (Ubuntu5.4.0-6 ubuntu1~16.04.11) 5.4.0 20160609

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-01-15 09:19:47

你有一个静态初始化顺序失败

不要将定义放在头文件中,因为这将导致每个https://en.wikipedia.org/wiki/Translation_unit_(programming)都有自己在头文件中定义的变量的副本。

这意味着getConfigTable返回的gTable1将与main.cc文件中定义的gTable1不同。当您使用它时,其他的gTable1可能还没有初始化。

解决方案是将全局变量放在一个转换单元(源文件)中。或者更好的是,根本没有全局变量。

票数 2
EN

Stack Overflow用户

发布于 2019-01-15 09:17:16

这段代码受到静态初始化顺序失败的影响。在gTable1翻译单元中初始化gName时,可能不会初始化main.cc翻译单元中的gName。注意,由于gTable1是在头文件中声明的static变量,所以每个翻译单元都有一个单独的实例。因此,直接访问它并使用getConfigTable将引用不同的对象。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54195769

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档