我知道有类似的问题,但没有一个对我的问题给出明确的答案......
就最佳实践而言,这两者都可以吗?或者我应该返回一个指针? 如果不是,应该如何更改它们以遵循最佳实践。
我想从函数返回对新对象的引用。我的实现如下:
MyClass& doSomething() {
return *(new MyClass());
}
MyClass a = doSomething();
这可以吗,因为 MyClass 的新实例正在使用 new 在堆上分配?
或者我应该让它保持不变(我不确定什么时候该不该)?
const MyClass& doSomething() {
return *(new MyClass());
}
如果这两个都是错误的,我应该只返回一个指向新对象的指针吗?
谢谢。
最佳答案
虽然这并非完全无效,但这不是一个好主意。
MyClass& doSomething() {
return *(new MyClass());
}
返回后,没有人拥有原始指针,因此没有人会删除它。*所以这是内存泄漏。
除非您有相应的delete,否则最好不要编写new — 或者更好的是,有一个智能指针构造函数。
同时,您原始代码中的这一行:
MyClass a = doSomething();
...无论如何都会复制该值。假设这不是另一个必须修复的错误,为什么还要麻烦堆分配对象并返回引用以进行复制和泄漏呢?只需按值返回对象:
MyClass doSomething() {
return MyClass();
}
现在您不必担心删除任何内容,因为您从未在堆上创建任何内容。
最佳实践通常可以用四个字母 RAII 来概括:Resource Acquisition Is Initialization。 (推论是,破坏就是释放。)如果您有一些东西不可能或昂贵地按值传递,则按值传递一些句柄。例如:
unique_ptr<MyClass> doSomething() {
return unique_ptr<MyClass>(new myClass());
}
unique_ptr<MyClass> a = doSomething();
现在它只是一个被复制的指针。对象本身在 doSomething 中创建,并在 a 超出范围时删除(或者,如果您将它传递给另一个变量,每当 that 超出范围等)。
另一方面,如果 MyClass 只是一些易于复制的值**,只需复制它即可。
* 删除它并非不可能;您始终可以获取指向引用的指针并删除。你不太可能会这样做,而且看起来很尴尬。如果你想传递指针,就传递指针。如果您不想传递指针,请将所有权包装在一个类中并按值传递该类。
** “易于复制”是指很容易安全地复制它们,而且您确实这样做了。例如,原始指针或文件句柄只有几个字节,默认的复制构造函数会很乐意为您复制它们……但是您最终会得到对同一个堆对象或文件的多个引用,并且无法跟踪谁负责删除或关闭它。
关于C++ 返回对新对象的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19394426/
总的来说,我对ruby还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用
在控制台中反复尝试之后,我想到了这种方法,可以按发生日期对类似activerecord的(Mongoid)对象进行分组。我不确定这是完成此任务的最佳方法,但它确实有效。有没有人有更好的建议,或者这是一个很好的方法?#eventsisanarrayofactiverecord-likeobjectsthatincludeatimeattributeevents.map{|event|#converteventsarrayintoanarrayofhasheswiththedayofthemonthandtheevent{:number=>event.time.day,:event=>ev
为什么4.1%2返回0.0999999999999996?但是4.2%2==0.2。 最佳答案 参见此处:WhatEveryProgrammerShouldKnowAboutFloating-PointArithmetic实数是无限的。计算机使用的位数有限(今天是32位、64位)。因此计算机进行的浮点运算不能代表所有的实数。0.1是这些数字之一。请注意,这不是与Ruby相关的问题,而是与所有编程语言相关的问题,因为它来自计算机表示实数的方式。 关于ruby-为什么4.1%2使用Ruby返
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
我有一个表单,其中有很多字段取自数组(而不是模型或对象)。我如何验证这些字段的存在?solve_problem_pathdo|f|%>... 最佳答案 创建一个简单的类来包装请求参数并使用ActiveModel::Validations。#definedsomewhere,atthesimplest:require'ostruct'classSolvetrue#youcouldevencheckthesolutionwithavalidatorvalidatedoerrors.add(:base,"WRONG!!!")unlesss
好的,所以我的目标是轻松地将一些数据保存到磁盘以备后用。您如何简单地写入然后读取一个对象?所以如果我有一个简单的类classCattr_accessor:a,:bdefinitialize(a,b)@a,@b=a,bendend所以如果我从中非常快地制作一个objobj=C.new("foo","bar")#justgaveitsomerandomvalues然后我可以把它变成一个kindaidstring=obj.to_s#whichreturns""我终于可以将此字符串打印到文件或其他内容中。我的问题是,我该如何再次将这个id变回一个对象?我知道我可以自己挑选信息并制作一个接受该信
如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象
我在Rails工作并有以下类(class):classPlayer当我运行时bundleexecrailsconsole然后尝试:a=Player.new("me",5.0,"UCLA")我回来了:=>#我不知道为什么Player对象不会在这里初始化。关于可能导致此问题的操作/解释的任何建议?谢谢,马里奥格 最佳答案 havenoideawhythePlayerobjectwouldn'tbeinitializedhere它没有初始化很简单,因为你还没有初始化它!您已经覆盖了ActiveRecord::Base初始化方法,但您没有调
我有一个服务模型/表及其注册表。在表单中,我几乎拥有服务的所有字段,但我想在验证服务对象之前自动设置其中一些值。示例:--服务Controller#创建Action:defcreate@service=Service.new@service_form=ServiceFormObject.new(@service)@service_form.validate(params[:service_form_object])and@service_form.saverespond_with(@service_form,location:admin_services_path)end在验证@ser
我有一个包含多个键的散列和一个字符串,该字符串不包含散列中的任何键或包含一个键。h={"k1"=>"v1","k2"=>"v2","k3"=>"v3"}s="thisisanexamplestringthatmightoccurwithakeysomewhereinthestringk1(withspecialcharacterslike(^&*$#@!^&&*))"检查s是否包含h中的任何键的最佳方法是什么,如果包含,则返回它包含的键的值?例如,对于上面的h和s的例子,输出应该是v1。编辑:只有字符串是用户定义的。哈希将始终相同。 最佳答案