如果我在控制结构的 block 内定义一个变量,它是否仅存在于该控制结构的 block 的执行中,而不存在于封闭函数的整个执行过程中?
另外,我如何监控程序的确切内存使用情况及其变化(即:通过创建和销毁变量来改变内存使用情况)?
稍后补充: 在下面的代码中,我知道 v 范围是 if block ,但我想知道 v 是在内存中在 if block 的开始/结束处还是在函数 func 的开始/结束处创建/销毁?
void func ()
{
if (true)
{
int v;//automatic storage class
v = 1;
}
}
最佳答案
If I define a variable inside the block of a control structure, does it exist only in the execution of that control structure's block and not in the whole execution of the enclosing function?
这取决于您在哪里声明变量而不是定义它。
该变量只能在您声明它的范围内访问。如果您显式传递它,它可以超出范围访问,但它是否仍然有效将取决于变量的存储类型。
例如:static变量在整个程序生命周期中保持事件状态,同时,
从函数返回自动变量的地址将导致未定义的行为,因为该变量在函数返回后不再有效。
好读: What is the difference between a definition and a declaration?
How can I monitor the exact memory usage of my programs and its changes (i.e.: changes in memory usage by creating and destroying variables)?
我相信您会希望获得有关动态分配对象的信息,因为自动对象只在其范围内存在足够长的时间,它们会自动销毁,因此它们通常不会引起任何问题。
对于动态对象您可以使用内存分析工具,如 valgrind with Massif 或者你可以 replace new and delete operators for your class并收集诊断信息。
编辑:解决更新后的问题。
In following code I know
vscope isifblock, but I want to know whethervis created/destroyed in the memory at the start/end of the if block or at the start/end of the functionfunc?
通过这个小小的修改可以很简单的演示和验证对象的创建和销毁code sample : 输出是: Before Calling func()v当声明它的范围开始并且声明它的语句被执行时创建。 v一旦范围结束即被销毁,即}达到了。
此概念用于构成 C++ 中使用最广泛的概念之一的基础,称为 Resource Allocation is Initialization(RAII)。 。每个 C++ 程序员绝对必须知道它。 #include<iostream>
class Myclass
{
public:
Myclass(){std::cout<<"\nIn Myclass Constructor ";}
~Myclass(){std::cout<<"\nIn Myclass Destructor";}
};
void func()
{
std::cout<<"\nBefore Scope Begins";
if (true)
{
Myclass obj;//automatic storage class
}
std::cout<<"\nAfter Scope Ends";
}
int main()
{
std::cout<<"\nBefore Calling func()";
func();
std::cout<<"\nAfter Calling func()";
return 0;
}
Before Scope Begins
In Myclass Constructor
In Myclass Destructor
After Scope Ends
After Calling func()
关于c++ - 在控制结构 block 中定义变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10674874/
我正在尝试设置一个puppet节点,但rubygems似乎不正常。如果我通过它自己的二进制文件(/usr/lib/ruby/gems/1.8/gems/facter-1.5.8/bin/facter)在cli上运行facter,它工作正常,但如果我通过由rubygems(/usr/bin/facter)安装的二进制文件,它抛出:/usr/lib/ruby/1.8/facter/uptime.rb:11:undefinedmethod`get_uptime'forFacter::Util::Uptime:Module(NoMethodError)from/usr/lib/ruby
我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h
我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
我正在查看instance_variable_set的文档并看到给出的示例代码是这样做的:obj.instance_variable_set(:@instnc_var,"valuefortheinstancevariable")然后允许您在类的任何实例方法中以@instnc_var的形式访问该变量。我想知道为什么在@instnc_var之前需要一个冒号:。冒号有什么作用? 最佳答案 我的第一直觉是告诉你不要使用instance_variable_set除非你真的知道你用它做什么。它本质上是一种元编程工具或绕过实例变量可见性的黑客攻击
我有一些Ruby代码,如下所示:Something.createdo|x|x.foo=barend我想编写一个测试,它使用double代替block参数x,这样我就可以调用:x_double.should_receive(:foo).with("whatever").这可能吗? 最佳答案 specify'something'dox=doublex.should_receive(:foo=).with("whatever")Something.should_receive(:create).and_yield(x)#callthere
我想向我的Controller传递一个参数,它是一个简单的复选框,但我不知道如何在模型的form_for中引入它,这是我的观点:{:id=>'go_finance'}do|f|%>Transferirde:para:Entrada:"input",:placeholder=>"Quantofoiganho?"%>Saída:"output",:placeholder=>"Quantofoigasto?"%>Nota:我想做一个额外的复选框,但我该怎么做,模型中没有一个对象,而是一个要检查的对象,以便在Controller中创建一个ifelse,如果没有检查,请帮助我,非常感谢,谢谢
我已经从我的命令行中获得了一切,所以我可以运行rubymyfile并且它可以正常工作。但是当我尝试从sublime中运行它时,我得到了undefinedmethod`require_relative'formain:Object有人知道我的sublime设置中缺少什么吗?我正在使用OSX并安装了rvm。 最佳答案 或者,您可以只使用“require”,它应该可以正常工作。我认为“require_relative”仅适用于ruby1.9+ 关于ruby-主要:Objectwhenrun
我正在编写一个gem,我必须在其中fork两个启动两个webrick服务器的进程。我想通过基类的类方法启动这个服务器,因为应该只有这两个服务器在运行,而不是多个。在运行时,我想调用这两个服务器上的一些方法来更改变量。我的问题是,我无法通过基类的类方法访问fork的实例变量。此外,我不能在我的基类中使用线程,因为在幕后我正在使用另一个不是线程安全的库。所以我必须将每个服务器派生到它自己的进程。我用类变量试过了,比如@@server。但是当我试图通过基类访问这个变量时,它是nil。我读到在Ruby中不可能在分支之间共享类变量,对吗?那么,还有其他解决办法吗?我考虑过使用单例,但我不确定这是
当我在Rails控制台中按向上或向左箭头时,出现此错误:irb(main):001:0>/Users/me/.rvm/gems/ruby-2.0.0-p247/gems/rb-readline-0.4.2/lib/rbreadline.rb:4269:in`blockin_rl_dispatch_subseq':invalidbytesequenceinUTF-8(ArgumentError)我使用rvm来管理我的ruby安装。我正在使用=>ruby-2.0.0-p247[x86_64]我使用bundle来管理我的gem,并且我有rb-readline(0.4.2)(人们推荐的最少