2

我正在创建一个组件,一个模板的泛化。对于创建必须使用字符串标识符。

我正在更换:

#define MYCOMPONENT_CONSTANT_IDENTIFIER        "ID value"

namespace myComponent
{
    static const QString constant_identifier = "ID value"
}

遵循一些编码标准(MISRA,...)。

这应该适用于 C++。我在Constants-only 头文件 C++中检查了它。

此常量在组件“myComponent”的标题中定义,并包含在初始化我的索引器和创建组件的标题中。这在更换时没有改变。

替换构建成功,但尝试运行失败。分段错误发生在:

template<>
inline void TMyIndexer::Init()
{
  Map(...)
  //before
  //Map( ENUM_VAL, QSharedPointer<ITableFieldDefs>(new myComponent::TTableFieldDefs(MYCOMPONENT_CONSTANT_IDENTIFIER)) );
  Map( ENUM_VAL, QSharedPointer<ITableFieldDefs>(new myComponent::TTableFieldDefs(myComponent::constant_identifier)) );
  Map(...)
}

在哪里:

// TStaticFieldDefs<> implements ITableFieldDefs
typedef TStaticFieldDefs<myComponent::Fields> TTableFieldDefs;

//constructor
TStaticFieldDefs(QString id) : fId(id) {}

如果我上堆栈:

2.) qstring.h: 内联 QString::QString(const QString &other) : d(other.d) { Q_ASSERT(&other != this); d->ref.ref(); }

1.) qatomic_x86_64.h: 内联 bool QBasicAtomicInt::ref()

我想模板泛化、构造函数中的内联定义或其他我不知道的东西有问题。

欢迎任何解释。

我没有想法,请寻求帮助。

4

1 回答 1

2

我的猜测是您正在尝试从静态上下文中使用常量对象。C++ 标准规定静态对象初始化的顺序是未定义的。因此,您可能会引用可能导致段错误的未初始化对象。

于 2013-07-26T12:38:39.833 回答