初始化命令惨败的可能解决方案?

时间:2017-01-16 09:18:20

标签: c++

阅读了很多关于我发现的这个众所周知的问题,并在第一次使用"时使用了#34;但它的主要问题是它会产生内存泄漏。

工作了一下,我已经做了一些轻微修改试图解决这个问题,我得到了一个解决方案:

1)使用全局静态指针代替本地静态指针

2)使用单独的功能删除对象。

示例:

static myObject* myObjectPtr=nullptr;

static myObjectDel() {delete myObjectPtr;}

inline myObject& myObjectRef()
{
  if(myObjectPtr==nullptr)
  {
    myObjectPtr=new myObjectPtr;
    atexit(myObjectDel);
  }

  return(*myObjectPtr);
}

所以,我可以确保:

1)首次使用前创建对象。

2)上次使用后删除该对象。

3)没有内存泄漏。

它适用于MS Visual Studio 2013,因为静态指针在程序启动时已初始化为零,但我不确定所有编译器和操作系统是否都这样做。

换句话说,它是否可移植?

谢谢你,抱歉我的英语不好(我不是英国人)

2 个答案:

答案 0 :(得分:5)

您的解决方案是可移植的,但它不是线程安全的 它也不必要地复杂化。

不要使用动态分配:

inline myObject& myObjectRef()
{
    static myObject theObject;
    return theObject;
}

无泄漏(自时间开始)和线程安全(自C ++ 11以来)。

答案 1 :(得分:1)

我更喜欢static myObject* myObjectPtr;,因为无论如何,所有static指针都会初始化为nullptr。 C ++标准保证了。

但是你的代码很容易受到第一次调用inline myObject& myObjectRef()的两个线程的影响,可以导致多个new只与一个delete进行平衡。您应该在该函数中使用互斥锁来消除它。