C++ 初始化订单失败的可能解决方案?

C++ 初始化订单失败的可能解决方案?,c++,C++,在阅读了很多关于这个众所周知的问题的文章后,我发现并使用了“首次使用时创建”,但它的主要问题是它会产生内存泄漏 经过一点努力,我做了一些轻微的修改,试图解决这个问题,我得到了一个解决方案: 1) 使用全局静态指针代替本地静态指针 2) 使用单独的函数删除对象 例如: static myObject* myObjectPtr=nullptr; static myObjectDel() {delete myObjectPtr;} inline myObject& myObjectRef(

在阅读了很多关于这个众所周知的问题的文章后,我发现并使用了“首次使用时创建”,但它的主要问题是它会产生内存泄漏

经过一点努力,我做了一些轻微的修改,试图解决这个问题,我得到了一个解决方案:

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,因为静态指针在程序启动时初始化为零,但我不确定是否所有编译器和操作系统都这样做

换句话说,它是便携式的吗


谢谢你,很抱歉我的英语很差(我不是英语母语)

我更喜欢
静态myObject*myObjectPtr静态
指针都将初始化为
nullptr
。C++标准保证了


但是您的代码很容易受到两个线程的攻击,这两个线程第一次调用
内联myObject&myObjectRef()
,这可能导致多个
新建
与一个
删除
相平衡。您应该在该函数中使用互斥来避免这种情况。

我更喜欢
静态myObject*myObjectPtr静态
指针都将初始化为
nullptr
。C++标准保证了


但是您的代码很容易受到两个线程的攻击,这两个线程第一次调用
内联myObject&myObjectRef()
,这可能导致多个
新建
与一个
删除
相平衡。您应该在该函数中使用互斥来避免这种情况。

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

不要使用动态分配:

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

无泄漏(从时间的黎明开始)和线程安全(从C++11开始)。

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

不要使用动态分配:

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

无泄漏(从时间开始)和线程安全(因为C++ 11)。< /P>作为旁瓣,任何现代解决方案都应该避免使用裸指针,而使用共享或唯一PTR代替。作为旁瓣,任何现代解决方案都应避免裸指针,而不是使用共享或唯一PTR。我不认为使用“零初始化”是正确的,而不是C++。

静态
指针初始化为
nullptr
值,即使该值与零位模式不对应。(这就是为什么您使用
{}
符号来表示具有指针成员的类的自动实例,而不是memset(…0))我现在只有cppreference来指导我。但是你似乎确实是对的,而我错了。我不认为使用“零初始化”是正确的,而不是C++。
静态
指针初始化为
nullptr
值,即使该值与零位模式不对应。(这就是为什么您使用
{}
符号来表示具有指针成员的类的自动实例,而不是memset(…0))我现在只有cppreference来指导我。但是你似乎确实是对的,而我错了。我真想掐一下这个。这是个好主意。但是,在C++11和更新版本中,只有线程安全的(尽管OP解决方案也不是线程安全的,所以我猜他没有这样的要求)。这是实现单例的方法。而且已经好几年了!我真想掐一下这个。这是个好主意。但是,在C++11和更新版本中,只有线程安全的(尽管OP解决方案也不是线程安全的,所以我猜他没有这样的要求)。这是实现单例的方法。而且已经好几年了!