linux map insert错误,c – 为什么编译顺序在使用std :: map :: insert()时有时会导致分段错误?...

静态变量的初始化顺序未定义,因此它取决于您的特定设置,包括编译器,链接器和链接顺序.

初始化函数技巧

您可以使用初始化函数技巧来确保在需要时初始化某些内容.我知道这可以在Windows上使用Microsoft的C编译器(并且在Linux上对g进行了一些测试,见下文).

初始化函数

第一步是将地图作为静态变量移动到一个函数中,并始终通过此函数访问地图.

buttonmap_t& buttonMap() {

static buttonmap_t map;

return map;

}

用法

首次调用buttonMap()函数时会创建映射.如果您通过该功能访问地图,那么您可以确定它将被创建.

Controller::Button::Button(int type) :

type_(type) {

buttonMap()[type] = this;

}

关键部分是全局变量的初始化:用引号替换它并从保存变量的函数初始化它.

buttonmap_t& map = buttonMap();

说明

使用此设置初始化顺序无关紧要,因为对函数的第一次调用将执行初始化,并且每次调用之后将使用初始化实例.

注意:此技巧适用于全局变量,因为初始化阶段是在单个线程上完成的.即使您不知道初始化的确切顺序,也可以确保它将按顺序发生.

测试

我在我的家用电脑上使用g在Linux上进行了测试,它似乎有效:

$g++ main.cpp controller.cpp -Wall

$./a.out

running...

最终计划:

// controller.h

#ifndef CONTROLLER_H

#define CONTROLLER_H

class Controller {

public:

class Button {

public:

Button(int type = -1);

private:

int type_;

};

Controller();

Button A;

Button B;

Button X;

Button Y;

};

#endif

// controller.cpp

#include "controller.h"

#include

typedef std::map buttonmap_t;

buttonmap_t& ButtonMap() {

static buttonmap_t map;

return map;

}

buttonmap_t& map = ButtonMap();

Controller::Controller() :

A(0),

B(1),

X(2),

Y(3) {

}

Controller::Button::Button(int type) :

type_(type) {

ButtonMap()[type] = this;

}

// main.cpp

#include "controller.h"

#include

Controller controller;

int main(int argc, const char * argv[]) {

std::cout << "running..." << std::endl;

return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值