为什么要使用静态字符缓冲区来实例化从DLL加载的C++类

3

今天我看到一段C++代码,用于在从EXE加载DLL后实例化驻留在DLL中的类

extern "C"
{
    DLL_EXPORT MyClass *CreateClass()
    {
        static char classBuffer[sizeof(MyClass)];

        return new ((void*)classBuffer)MyClass();
    }
}

我不明白为什么这里我们不直接使用new运算符,而是首先声明静态缓冲区,然后再将其与类实例化一起使用。任何帮助都将不胜感激。

这是一段糟糕的代码。除非你想要单例,否则不要这样做,即使是这样也不完全正确。 - Nawaz
为什么这是糟糕的代码?为什么我们不能使用类型为MyClass的静态变量而不是char? - Stefano
@Nawaz,这甚至不是一个有效的单例模式,因为每次调用该函数时,构造函数都会在同一内存位置上被再次调用(一遍又一遍)。【哎呀,看起来您在此期间编辑了您的评论】。 - syam
这将在每次调用时重新初始化对象。它还将避免泄漏检测,因为没有从堆中分配任何内容。此外,该对象永远不会被销毁。不知道这是否有意为之? - Bo Persson
@Stefano 使用类型为 MyClassstatic 变量并返回指向它的指针将使其表现得像单例模式。上面的代码很糟糕,因为每次调用函数时都会调用 MyClass 构造函数并使用放置 new 来重复初始化相同的缓冲区。但是,也许作者就是有意这样做的。如果不知道用例是什么,就无法确定。 - Praetorian
显示剩余3条评论
1个回答

3
因为它避免了对 newdelete 的依赖,但仍然调用了构造函数。
但这也意味着你不能在同一个进程中拥有多个类的实例。这可能是有意为之,以避免多个实例,或者可能是一个缺陷。这完全取决于类本身的目的。但如果多次调用此函数会是一个坏主意 - 我认为它应该有一些保护措施来防止这种情况发生。
我觉得这不是解决问题的理想方式,但如果不了解类和这个实现的整体“背景”,很难说还有哪些其他解决方案,以及哪一个才是正确的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接