【发布时间】:2010-08-31 16:38:30
【问题描述】:
这是一个奇怪的问题,我不知道该怎么做。
我有类似以下的内容:
struct Parms
{
const std::string value1;
const std::string value2;
std::string parm1;
std::string parm2;
Parms() : parm1(value1), parm2(value1) {}
static const Parms& getDefaults()
{
static Parms defaults;
return defaults;
}
};
我通常这样使用:
Parms myParms = Parms::getDefaults();
myParms.parm1 = "crap";
functionThatNeedsParms(myParms);
非常简单。这从来没有让我头疼,直到我开始尝试使用 CxxTest 编写使用此代码的单元测试。我在不同的文件中有两个测试套件类,当我单独运行它们时,一切都很好。
当我将它们一起运行时,我看到了两件坏事。首先,整个核心转储试图双重释放静态默认变量。其次,如果我在默认值死前一段时间查看它的内容,但在我开始使用它之后,其中的静态 const std::strings 已损坏(一些字母随机更改,尽管它始终是每次运行都一样)。
发生了什么事?
【问题讨论】:
-
是不是和上面的代码一样(即getDefaults是隐式内联的,因为在类内部定义)。参数是否内置到一个库中,所有测试代码是否内置到另一个库中? value1/2 真的只是 const 成员,而不是引用或静态或其他奇怪的东西吗?
-
'defaults' 不是一个好名字。它非常类似于“默认”,这是一个 C++ 关键字
-
为什么帖子说单例?看起来这个类正在做更多的事情,而不仅仅是“单例”功能。
标签: c++ static singleton coredump