SIGSEGV与std ::指向模板对象的指针映射

时间:2015-06-09 12:57:48

标签: c++ templates inheritance g++ stdmap

我需要保留一个指向模板化对象的std :: map指针。 为了摆脱模板,我使用了一个共同的非模板基类。

运行代码时,我收到一个SIGSEGV信号。 调试显示问题出现在语句

data_[id] = s;

这可能是与对象初始化顺序相关的问题。

代码如下所示:

文件shared_iface.h:

class shared_iface {
    unsigned long int counter_;
};

文件shared.h:

extern CommunicationHandler comm;

template <typename T>
class shared: private shared_iface {
public:
    shared(): data_(nullptr), id_(0) {
        comm.add(id_, this);
    }
private:
    T* data_;
    unsigned long int id_;
};

文件communication_handler.h:

class CommunicationHandler {
public:
    inline void add(unsigned long int id, shared_iface* s) {
        data_.add(id, s);
    }
private:
    Dictionary data_;
};

文件communication_handler.cpp:

CommunicationHandler comm;

文件dictionary.h:

class Dictionary {
public:
    Dictionary() {
        data_.clear();
    }
    void add(unsigned long int id, shared_iface* s) {
        data_[id] = s;
    }
private:
    std::map<unsigned long int, shared_iface*> data_;
};

文件main.cpp:

#include "shared.hpp"

shared<int> c;

int main ()
{
    return 1;
}

1 个答案:

答案 0 :(得分:1)

  

这可能是与对象初始化顺序相关的问题。

一个很好的猜测。 cshared<int>类型的静态对象。 shared<T>的构造函数取决于静态对象commc可能会在comm之前初始化comm并且您将获得未定义的行为。 Route::get('accounts/create', [as => 'createAccount', 'uses' => 'AccountsController@create']); 可以先被初始化,你很幸运,你的代码不起作用。

这称为static initialization order fiasco。避免惨败的常用方法是Construct On First Use Idiom,但一般来说,避免依赖于其他静态对象的静态对象。