假设我创建了两个 vector ,一个在堆上,一个在栈上:
Vector<int> vector1;
Vector<int>* vector2 = new Vector<int>;
然后我通过 vector1分成两个函数,比如说,foo1(Vector<int>)和 foo2(Vector<int>&) .我也通过vector2进入foo3(Vector<int>*) .
由于我是 C++ 的新手,我对这里的行为差异感到很困惑。
我对 foo1 这样说对吗? , 整个 vector1被复制,对于 foo2 , 仅引用 vector1被传递到函数中?
但不是 vector1 ,在堆栈上声明,除了创建它的范围外,应该在其他任何地方(即从内部 foo2 )都无法访问?
另外,修改vector1的内容里面foo1 , foo2影响原始 vector ?
vector1在其范围结束时自动销毁,还是我们必须手动删除它?最佳答案
Am I right to say that for
foo1, the entirevector1gets copied, and forfoo2, only the reference tovector1gets passed into the function?
正确。
But isn't
vector1, declared on the stack, supposed to be inaccessible anywhere else (i.e. from insidefoo2) except the scope in which it was created?
它只是 vector1 的名称,外部无法访问,但您可以自由地传递它的地址(通过引用或指针传递)。当然,只要函数不返回,它就会继续存在,因此返回指向它的指针将是错误的(因为它会指向一个不再存在的对象)。
这与堆上的分配不同,堆上的分配没有范围限制的生命周期或自动删除 - 它留给你。这是一把双刃剑:您可以拥有具有自定义生命周期的对象,但您必须记住在不再需要它们时确实删除它们。
Also, does modifying the contents of
vector1insidefoo1,foo2affect the original vector?
foo1 的参数是一个新的、分离的 vector ,对它所做的任何修改都将保留在函数的本地。 foo2 的参数引用 vector1,因此它会影响原始 vector (实际上,引用通常被描述为其他对象的“别名”)。
And is
vector1automatically destroyed at the end of its scope, or do we have to delete it manually?
它会像任何局部变量一样自动销毁。 但是:vector2 必须手动删除,因为本地对象只是指针,没有析构函数(默认情况下它没有t 拥有它指向的对象)。
关于C++ 参数堆与堆栈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23607360/
exe应该在我打开页面时运行。异步进程需要运行。有什么方法可以在ruby中使用两个参数异步运行exe吗?我已经尝试过ruby命令-system()、exec()但它正在等待过程完成。我需要用参数启动exe,无需等待进程完成是否有任何rubygems会支持我的问题? 最佳答案 您可以使用Process.spawn和Process.wait2:pid=Process.spawn'your.exe','--option'#Later...pid,status=Process.wait2pid您的程序将作为解释器的子进程执行。除
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
我有一些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
我正在为一个项目制作一个简单的shell,我希望像在Bash中一样解析参数字符串。foobar"helloworld"fooz应该变成:["foo","bar","helloworld","fooz"]等等。到目前为止,我一直在使用CSV::parse_line,将列分隔符设置为""和.compact输出。问题是我现在必须选择是要支持单引号还是双引号。CSV不支持超过一个分隔符。Python有一个名为shlex的模块:>>>shlex.split("Test'helloworld'foo")['Test','helloworld','foo']>>>shlex.split('Test"
我不确定传递给方法的对象的类型是否正确。我可能会将一个字符串传递给一个只能处理整数的函数。某种运行时保证怎么样?我看不到比以下更好的选择:defsomeFixNumMangler(input)raise"wrongtype:integerrequired"unlessinput.class==FixNumother_stuffend有更好的选择吗? 最佳答案 使用Kernel#Integer在使用之前转换输入的方法。当无法以任何合理的方式将输入转换为整数时,它将引发ArgumentError。defmy_method(number)
两者都可以defsetup(options={})options.reverse_merge:size=>25,:velocity=>10end和defsetup(options={}){:size=>25,:velocity=>10}.merge(options)end在方法的参数中分配默认值。问题是:哪个更好?您更愿意使用哪一个?在性能、代码可读性或其他方面有什么不同吗?编辑:我无意中添加了bang(!)...并不是要询问nobang方法与bang方法之间的区别 最佳答案 我倾向于使用reverse_merge方法:option
我有一个只接受一个参数的方法:defmy_method(number)end如果使用number调用方法,我该如何引发错误??通常,我如何定义方法参数的条件?比如我想在调用的时候报错:my_method(1) 最佳答案 您可以添加guard在函数的开头,如果参数无效则引发异常。例如:defmy_method(number)failArgumentError,"Inputshouldbegreaterthanorequalto2"ifnumbereputse.messageend#=>Inputshouldbegreaterthano
我没有找到太多关于如何执行此操作的信息,尽管有很多关于如何使用像这样的redirect_to将参数传递给重定向的建议:action=>'something',:controller=>'something'在我的应用程序中,我在路由文件中有以下内容match'profile'=>'User#show'我的表演Action是这样的defshow@user=User.find(params[:user])@title=@user.first_nameend重定向发生在同一个用户Controller中,就像这样defregister@title="Registration"@user=Use
对于作为String#tr参数的单引号字符串文字中反斜杠的转义状态,我觉得有些神秘。你能解释一下下面三个例子之间的对比吗?我特别不明白第二个。为了避免复杂化,我在这里使用了'd',在双引号中转义时不会改变含义("\d"="d")。'\\'.tr('\\','x')#=>"x"'\\'.tr('\\d','x')#=>"\\"'\\'.tr('\\\d','x')#=>"x" 最佳答案 在tr中转义tr的第一个参数非常类似于正则表达式中的括号字符分组。您可以在表达式的开头使用^来否定匹配(替换任何不匹配的内容)并使用例如a-f来匹配一
我正在使用RubyonRails3.0.9,我想生成一个传递一些自定义参数的link_toURL。也就是说,有一个articles_path(www.my_web_site_name.com/articles)我想生成如下内容:link_to'Samplelinktitle',...#HereIshouldimplementthecode#=>'http://www.my_web_site_name.com/articles?param1=value1¶m2=value2&...我如何编写link_to语句“alàRubyonRailsWay”以实现该目的?如果我想通过传递一些