Meyers Singleton 是否适用于有动态库的场景?
IE。一个定义单例的库,其他人使用它,每个都在自己的编译单元中?
(我想这无关紧要,但具体架构是 OS X 上带有框架的应用程序)
我正在使用 Vanilla Meyers Singleton 模式:以下 Instance() 方法是在实用程序类的头文件中内联定义的(在动态库中定义):
static Logger& Instance()
{
static Logger singletonInstance;
return singletonInstance;
}
复制构造函数和 operator= 被声明为私有(private)且未实现,所以我们应该很好,对吧?
现在,如果我从主应用程序链接定义单例的库,我可以看到构造函数被调用多次.. this 的地址不同以及所有奇怪的地方我希望当没有实际的单例但类的多个实例时。
所以我想知道动态库方法是否搞砸了 Meyers 单例,或者每个编译单元 - 库,主应用程序 - 是否包含单例的 header (有效地声明和定义实例() 方法) 会得到“它自己的单例实例”吗?
真的不太确定我的观察结果如何,所以非常感谢任何提示!
最佳答案
您需要在 header 中声明 Instance,然后在动态库中定义它(大概是 Logger 定义在)。您需要删除 static。如果您使用 visibility tools,您需要确保 Instance 具有默认可见性.
根据您的描述,听起来您已经在 header 中定义了这个函数。这将为包含 header 的每个人提供他们自己的 Instance 私有(private)定义,因此他们自己对 Instance 中的 static Logger 的私有(private)定义。
您可以声明 Instance inline,这将为所有内容提供您期望的语义(与在 header 中声明和在 dylib 中定义相同)。但我的建议是只做内联以确认我告诉你的是正确的(这很容易),然后将大纲放入动态库中(并再次确认)。
勾勒出轮廓后,您的设计应该可以正常工作。
也就是说,它只能保证在 C++11 中工作。也就是说,局部静态在 C++98/03 中不是线程安全的,但在 C++11 及更高版本中是线程安全的。但是,在 OS X 上,作为扩展,即使在 C++03 语言模式下,它们也是线程安全的。
另一个注意事项:如果您在 atexit 链(或在全局对象的析构函数中)访问 Instance(),您的访问可能发生在静态本地对象的析构之后Instance() 中的 singletonInstance,导致未定义的行为。如果您不使用 atexit() 进行注册,并且您的全局析构函数不调用 Instance(),那么您就是安全的。否则你不是。如果你不安全,你可以故意泄露它:
Logger& Instance()
{
static Logger* singletonInstance = new Logger;
return *singletonInstance;
}
这可能会导致一些内存泄漏检查器报告误报(或者根据您的观点,它们可能是真报),这很烦人。
关于c++ - Meyers 单例和动态库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21442758/
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:
我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我
有没有办法在Ruby中动态创建数组?例如,假设我想遍历用户输入的书籍数组:books=gets.chomp用户输入:"TheGreatGatsby,CrimeandPunishment,Dracula,Fahrenheit451,PrideandPrejudice,SenseandSensibility,Slaughterhouse-Five,TheAdventuresofHuckleberryFinn"我把它变成一个数组:books_array=books.split(",")现在,对于用户输入的每一本书,我想用Ruby创建一个数组。伪代码来做到这一点:x=0books_array.
我想在IRB中浏览文件系统并让提示更改以反射(reflect)当前工作目录,但我不知道如何在每个命令后进行提示更新。最终,我想在日常工作中更多地使用IRB,让bash溜走。我在我的.irbrc中试过这个:require'fileutils'includeFileUtilsIRB.conf[:PROMPT][:CUSTOM]={:PROMPT_N=>"\e[1m:\e[m",:PROMPT_I=>"\e[1m#{pwd}>\e[m",:PROMPT_S=>"FOO",:PROMPT_C=>"\e[1m#{pwd}>\e[m",:RETURN=>""}IRB.conf[:PROMPT_MO
我有一个数组数组,想将元素附加到子数组。+=做我想做的,但我想了解为什么push不做。我期望的行为(并与+=一起工作):b=Array.new(3,[])b[0]+=["apple"]b[1]+=["orange"]b[2]+=["frog"]b=>[["苹果"],["橙子"],["Frog"]]通过推送,我将推送的元素附加到每个子数组(为什么?):a=Array.new(3,[])a[0].push("apple")a[1].push("orange")a[2].push("frog")a=>[[“苹果”、“橙子”、“Frog”]、[“苹果”、“橙子”、“Frog”]、[“苹果”、“
首先,我使用的是rails3.1.3和来自master的carrierwavegithub仓库的分支。我使用after_init钩子(Hook)来确定基于属性的字段页面模型实例并为这些字段定义属性访问器将值存储在序列化哈希中(希望它清楚我是什么谈论)。这是我正在做的事情的精简版:classPage省略mount_uploader命令让我可以访问我想要的属性。但是当我安装uploader时出现错误消息说“nil类的未定义新方法”我在源代码中读到有方法read_uploader和扩展模块中的write_uploader。我如何必须覆盖这些来制作mount_uploader命令使用我的“虚拟
有没有办法让Ruby能够做这样的事情?classPlane@moved=0@x=0defx+=(v)#thisiserror@x+=v@moved+=1enddefto_s"moved#{@moved}times,currentxis#{@x}"endendplane=Plane.newplane.x+=5plane.x+=10putsplane.to_s#moved2times,currentxis15 最佳答案 您不能在Ruby中覆盖复合赋值运算符。任务在内部处理。您应该覆盖+,而不是+=。plane.a+=b与plane.a=
我正在尝试动态构建一个多维数组。我想要的基本上是这样的(为简单起见写出来):b=0test=[[]]test[b]这给了我错误:NoMethodError:undefinedmethod`test=[[],[],[]]而且它工作正常,但在我的实际使用中,我不会事先知道需要多少个数组。有一个更好的方法吗?谢谢 最佳答案 不需要像您正在使用的索引变量。只需将每个数组附加到您的test数组:irb>test=[]=>[]irb>test[["a","b","c"]]irb>test[["a","b","c"],["d","e","f"]]
如何只加载map边界内的标记gmaps4rails?当然,在平移和/或缩放后加载新的。与此直接相关的是,如何获取map的当前边界和缩放级别? 最佳答案 我是这样做的,我只在用户完成平移或缩放后替换标记,如果您需要不同的行为,请使用不同的事件监听器:在你看来(index.html.erb):{"zoom"=>15,"auto_adjust"=>false,"detect_location"=>true,"center_on_user"=>true}},false,true)%>在View的底部添加:functiongmaps4rail