c++ - 全局静态动态分配对象 C++

标签 c++ static heap-memory global

我有一个关于动态分配的静态全局对象的非常具体的问题。在我的项目中,我需要在整个应用程序生命周期中从不同位置跨线程访问的对象很少。我想在应用程序退出时在应用程序初始化和分发时创建。所以我试着跟随,

头文件:MyObjectFactory.h

class MyObjectFactory{
   public:
      static MyObject* GetMyObject();
};

源文件:MyObjectFactory.cpp

static MyObject* gMyObject = 0;

MyObject* MyObjectFactory::GetMyObject(){
    if(gMyObject == 0)
    {
        gMyObject = new MyObject();
    }
    return gMyObject;
}

这段代码似乎可以工作,但我想清除一些东西。

  1. 对象将只创建一次,然后返回对对象的引用。 (我想要这个是因为 MyObject 封装了很少的系统资源,比如文本文件)
  2. MyObject 在应用程序退出时被销毁。
  3. 对象创建堆(因为我使用的是 new )或全局内存(因为我使用的是 static )在哪里?还是我违反了任何 OOP 原则?
  4. 可以从多线程调用 MyObjectFactory::GetMyObject() 吗?
  5. 这是实现类似于 Singleton 的好方法吗?

请让我知道您的意见。

非常感谢!

最佳答案

以最少的麻烦实现正确的销毁和正确的初始化的标准方法是使用 block 局部静态,如下所示:

foo.hpp:

struct Foo
{
    static Foo & get();
    // ...
};

foo.cpp:

#include "foo.hpp"

Foo & Foo::get()
{
    static Foo impl;
    return impl;
}

现在您可以在代码的任何地方使用 Foo::get()。没有指针,没有动态分配,也没有任何泄漏。一个真正的静态单例。

关于c++ - 全局静态动态分配对象 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10802360/

相关文章:

c++ - 为什么可以更改虚拟成员或公共(public)基类的可见性?

c++ - 管理退出程序的转义键

java - 我合并了来自 java 中 n 个线程的结果

linux - 通过 shell 脚本运行应用程序时,Valgrind 不显示正确的堆使用情况

c++ - 构建一个包含 opencv 库的 cmake c++ 项目

c - 在 C 中使用静态变量的唯一 ID

java - 玩!框架使用 <lot> 的静态变量

java - Java 进程使用的总内存和堆大小

arrays - C 将大文本文件加载到数组中

c++ - 如何使用 opencv 和 C++ 在图像的特定区域找到轮廓?