相关疑难解决方法(0)

C++ Nifty Counter习语; 为什么?

我最近遇到了Nifty Counter Idiom.我的理解是,这用于在标准库中实现全局变量,如cout,cerr等.由于专家选择了它,我认为它是一种非常强大的技术.

我试图了解使用更像Meyer Singleton的东西的优势.

例如,人们可以在头文件中:

inline Stream& getStream() { static Stream s; return s; }
static Stream& stream = getStream();
Run Code Online (Sandbox Code Playgroud)

优点是您不必担心引用计数,放置新的,或者有两个类,即代码更简单.既然没有这样做,我肯定有一个原因:

  1. 这是不是保证在共享和静态库中只有一个全局对象?似乎ODR应该保证只能有一个静态变量.
  2. 是否有某种性能成本?看起来在我的代码和Nifty Counter中,你都遵循一个引用来获取对象.
  3. 是否存在引用计数实际有用的情况?看起来它仍然会导致正在构造的对象,如果包含头部,并在程序结束时销毁,如Meyer Singleton.
  4. 答案是否涉及手动dlopen'ing?我对此没有太多经验.

编辑:在阅读Yakk的答案时,我被提示编写以下代码,我将其作为快速演示添加到原始问题中.这是一个非常小的例子,展示了如何使用Meyer Singleton +全局引用在main之前进行初始化:http://coliru.stacked-crooked.com/a/a7f0c8f33ba42b7f.

c++ singleton static-initialization c++11

26
推荐指数
2
解决办法
2518
查看次数

管理单例析构函数

以下小例子实现了我多次见过的单例模式:

#include <iostream>

class SingletonTest {
private:
  SingletonTest() {}
  static SingletonTest *instance;
  ~SingletonTest() {
    std::cout << "Destructing!!" << std::endl;
  }

public:
  static SingletonTest *get_instance()  {
    if(!instance) instance = new SingletonTest;
    return instance;
  }
};

SingletonTest *SingletonTest::instance = 0;

int main(int argc, char *argv[]) {
  SingletonTest *s = SingletonTest::get_instance();

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

我遇到的主要问题是我的单身人士的析构函数从未被调用过.

我可以改为instance(c ++ 0x?)shared_ptr,这很好用 - 除了它意味着我的析构函数必须公开.

我可以添加一个静态的'清理'方法,但这会打开用户错误的可能性(即忘记调用它).面对(未处理的)例外,它也不允许适当的清理.

是否存在允许延迟实例化的常见策略/模式,"自动"调用我的析构函数,并且仍然允许我将析构函数保密?

c++ c++11

6
推荐指数
1
解决办法
8936
查看次数

标签 统计

c++ ×2

c++11 ×2

singleton ×1

static-initialization ×1