用C++替换内存管理器的单例解决方案

Replacing a singleton solution for a memory manager in C++

本文关键字:单例 解决方案 管理器 内存 C++ 替换      更新时间:2023-10-16

我的项目中有两个用于管理内存的类:MemoryStorageMemoryFile

第一个类似于HDD,通过使用singleton(添加、删除、释放等)来保持MemoryFiles(文件、目录等)。第二个类似于fstream,但用于内存(打开、关闭、写入、读取等)

使用示例

MemoryFile file(&MemoryStorage);
// Open file in write mode
if (file.open("filename", open_mode::out)) {
    // Data file
    int* obj = new int;
    *obj = 0;
    // Write in internal buff
    file.write(obj, sizeof(int));
    delete obj;
    // Put buff in MemoryStorage and clear buff
    file.close();
}
// Other moment
// Open file in read mode
if (file.open("filename", open_mode::in)) {
    // Data file
    int* obj = new int;
    // Write in internal buff
    file.read(obj, sizeof(int));
    cout << *obj << endl; // Print: 0
    delete obj;
    // Put buff in MemoryStorage and clear buff
    file.close();
}

如果我不使用singleton,那么在内存中创建具有相同名称的文件是可能的,这会导致文件系统不一致。

我读过几篇关于堆栈溢出的文章,比如这篇文章,这些文章讨论了许多程序员认为singleton是一种糟糕的模式。

否则,如果没有单例模式,我该如何解决上面的编程问题?我是否在MemoryStorage中使用一个私有静态成员来复制singleton的效果?

无论您的用例如何,如果您绝对确定所代表的对象在现实世界中只有一个实例,例如内存管理器,那么使用singleton肯定是一个合理的选择。

singleton的问题是,它并不像看上去的那样简单。举几个你将要面对的问题——关于多线程环境,你能绝对保证不会创建两个singleton吗?单身汉的毁灭呢?那么继承,或者有更多的单身汉呢?

我建议,如果您觉得单例是一种可行的方法,请尝试一下,但在开始实现之前,请注意您可能需要解决的所有问题。

YATAS!关于单身汉的另一条线索。只有当它们代表以单数形式自然存在的东西时,才应该使用单数,只用于您正在执行的过程。像FILESYSTEM、LOG等

同时,如果你有真正的理由,不要回避单身人士。不要听纯粹主义者的话,除了"代码样本",他们几乎不写任何真正的代码。