在while 或for 循环内创建的变量是否在循环执行完成后从内存中释放/删除?另外,在循环中创建临时变量是一种不好的编码习惯吗?
在这个例子中,它是创建 100 个 X 变量然后处理它们,还是在每次迭代中处理它们?谢谢。 示例:
int cc =0;
while(cc < 100){
int X = 99; // <-- this variable
cc++;
}
最佳答案
Scope 和 lifetime 是两个不同的东西。对于在没有 static 的 block 范围内定义的变量,它们或多或少是紧密相连的,但它们仍然是不同的概念——如果你不保持它们的正确性,你可能会自责.
引用问题的片段:
int cc =0;
while(cc < 100){
int X = 99; // <-- this variable
cc++;
}
X 的范围 是其名称可见的程序文本区域。它从定义它的点延伸到封闭 block 的末尾,由 { 和 } 字符分隔。 (该 block 恰好是 while 语句的一部分这一事实并不直接相关;它是 block 本身定义了范围。)
在 block 内部,名称 X 指的是那个 int 变量。 block 外,名称X不可见。
X的生命周期是X在逻辑上存在的时间。它在执行到达开始 { 时开始(在定义之前),并在执行到达结束 } 时结束。如果 block 被执行 100 次,那么 X 会被创建和“销毁”100 次,并且有 100 个不相交的生命周期。
虽然 name X 仅在其范围内可见,但可以访问名为 X 的 object (直接或间接)在其生命周期内的任何时间。例如,如果我们将 &X 传递给函数,则该函数可能会读取和更新对象,即使该函数完全超出其范围。
您可以获取 X 的地址,并保存该地址以在其生命周期结束后使用——但这样做会导致未定义的行为。指向生命周期已结束的对象的指针是不确定的,任何取消引用它的尝试——甚至引用指针的值——都有未定义的行为。
当一个对象到达其生命周期的尽头时,实际上并没有什么特别的事情发生。该语言只要求对象在其生命周期内存在;除此之外,所有赌注都没有了。分配用于保存对象的堆栈空间可能会被释放(这通常只是意味着移动堆栈指针),或者,作为一种优化,堆栈空间可能会保持分配状态并重新用于循环的下一次迭代。
Also, is it a bad coding habit to create temporary variables inside a loop?
一点也不。只要您在对象的生命周期结束后不保存对象的地址,它就没有任何问题。作为性能优化,分配和释放通常会在进入和退出函数而不是 block 时完成。将变量限制在相当紧凑的范围内是一个非常好的编码习惯。它通过限制代码不同部分之间不必要的交互,使代码更易于理解。如果 X 是在循环体内部定义的,那么循环之外的任何东西都不会影响它(如果你没有做太棘手的事情的话),这使得对代码的推理变得更容易。
更新:如果 X 是具有非平凡构造函数和/或析构函数的类型,则 X 的创建和销毁实际上必须在进入和从 block 中退出(除非编译器能够优化该代码)。对于 int 类型的对象,这不是问题。
关于c++ - 循环完成后,循环内的变量(while 或 for)是否被释放?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26556449/
给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru
我脑子里浮现出一些关于一种新编程语言的想法,所以我想我会尝试实现它。一位friend建议我尝试使用Treetop(Rubygem)来创建一个解析器。Treetop的文档很少,我以前从未做过这种事情。我的解析器表现得好像有一个无限循环,但没有堆栈跟踪;事实证明很难追踪到。有人可以指出入门级解析/AST指南的方向吗?我真的需要一些列出规则、常见用法等的东西来使用像Treetop这样的工具。我的语法分析器在GitHub上,以防有人希望帮助我改进它。class{initialize=lambda(name){receiver.name=name}greet=lambda{IO.puts("He
我有多个ActiveRecord子类Item的实例数组,我需要根据最早的事件循环打印。在这种情况下,我需要打印付款和维护日期,如下所示:ItemAmaintenancerequiredin5daysItemBpaymentrequiredin6daysItemApaymentrequiredin7daysItemBmaintenancerequiredin8days我目前有两个查询,用于查找maintenance和payment项目(非排他性查询),并输出如下内容:paymentrequiredin...maintenancerequiredin...有什么方法可以改善上述(丑陋的)代
我的瘦服务器配置了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除非你真的知道你用它做什么。它本质上是一种元编程工具或绕过实例变量可见性的黑客攻击
我想向我的Controller传递一个参数,它是一个简单的复选框,但我不知道如何在模型的form_for中引入它,这是我的观点:{:id=>'go_finance'}do|f|%>Transferirde:para:Entrada:"input",:placeholder=>"Quantofoiganho?"%>Saída:"output",:placeholder=>"Quantofoigasto?"%>Nota:我想做一个额外的复选框,但我该怎么做,模型中没有一个对象,而是一个要检查的对象,以便在Controller中创建一个ifelse,如果没有检查,请帮助我,非常感谢,谢谢
这个问题在这里已经有了答案:Checktoseeifanarrayisalreadysorted?(8个答案)关闭9年前。我只是想知道是否有办法检查数组是否在增加?这是我的解决方案,但我正在寻找更漂亮的方法:n=-1@arr.flatten.each{|e|returnfalseife
我正在编写一个gem,我必须在其中fork两个启动两个webrick服务器的进程。我想通过基类的类方法启动这个服务器,因为应该只有这两个服务器在运行,而不是多个。在运行时,我想调用这两个服务器上的一些方法来更改变量。我的问题是,我无法通过基类的类方法访问fork的实例变量。此外,我不能在我的基类中使用线程,因为在幕后我正在使用另一个不是线程安全的库。所以我必须将每个服务器派生到它自己的进程。我用类变量试过了,比如@@server。但是当我试图通过基类访问这个变量时,它是nil。我读到在Ruby中不可能在分支之间共享类变量,对吗?那么,还有其他解决办法吗?我考虑过使用单例,但我不确定这是
我是一个Rails初学者,但我想从我的RailsView(html.haml文件)中查看Ruby变量的内容。我试图在ruby中打印出变量(认为它会在终端中出现),但没有得到任何结果。有什么建议吗?我知道Rails调试器,但更喜欢使用inspect来打印我的变量。 最佳答案 您可以在View中使用puts方法将信息输出到服务器控制台。您应该能够在View中的任何位置使用Haml执行以下操作:-puts@my_variable.inspect 关于ruby-on-rails-如何在我的R
我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("