【发布时间】:2016-12-12 07:14:54
【问题描述】:
嗨,我有一个 sn-p 代码,它是一个单例类(我相信),它以我以前从未见过的方式使用“新”和其他一些范围和静态限定符。因为我不知道它叫什么,所以我找不到任何关于它的作用或用途的信息。代码如下:
在我的 myClass.h 文件中
class myClass
{
private:
static myClass sm_myClass;
myClass();
public:
static void Create(void);
};
在 myClass.cpp 我有
#include "myClass.h"
#include <new>
myClass* p_myClass = NULL;
myClass myClass::sm_myClass;
myClass::myClass()
{
}
void myClass::Create(void)
{
p_myClass = &sm_myClass;
new (p_myClass) myClass();
}
我的问题是:
1 - .cpp 文件的第 6 行 (myClass myClass::sm_myClass;) 发生了什么
2 - .cpp 文件的第 16 行 (new (p_myClass) myClass(); ) 发生了什么
3 - 以这种方式使用类的总体目的是什么?
我真的希望这个问题不要重复。我搜索了一段时间的答案,但不知道要搜索什么术语。感谢您的帮助。
【问题讨论】:
-
FWIW 如果你想使用单例,请参阅:stackoverflow.com/questions/1008019/c-singleton-design-pattern
-
对象
sm_myClass在程序启动时被构造。对placement new 的调用尝试在已经存在的对象之上构造一个新对象,从而给出未定义的行为。 -
@PeteBecker:在现有对象上放置新位置实际上是可以的,但显然不建议这样做。 IIRC,如果你依赖析构函数来获得一些副作用,它只是 UB。
-
@GManNickG -- 在有限的情况下可能没问题,但这是高级技术,完全不适合初学者的代码。