在学习不同的语言时,我经常看到动态分配的对象,最常见的是在 Java 和 C# 中,如下所示:
functionCall(new className(initializers));
我知道这在内存管理语言中是完全合法的,但是这种技术可以在 C++ 中使用而不会导致内存泄漏吗?
最佳答案
您的代码是有效的(假设 functionCall() 实际上保证了指针被删除),但它很脆弱并且会在大多数 C++ 程序员的头脑中敲响警钟。
您的代码存在多个问题:
functionCall(new className(initializers), new className(initializers)); 假设第一个分配成功,但是第二个抛出异常(可能是内存不足) ,或者类构造函数抛出异常)。 functionCall 永远不会被调用,并且不能释放内存。简单(但仍然困惑)的解决方案是先分配内存,存储指针,然后在声明时在同一范围内释放它(因此调用函数拥有内存):
className* p = new className(initializers);
functionCall(p);
delete p;
但这仍然是一团糟。如果 functionCall 抛出异常怎么办?那么p不会被删除。除非我们在整个事情周围添加一个 try/catch,但是天哪,那太乱了。 如果函数变得有点复杂,并且可能在 functionCall 之后但在 delete 之前返回怎么办?糟糕,内存泄漏。无法维护。错误的代码。
所以一个不错的解决方案是使用智能指针:
boost::shared_ptr<className> p = boost::shared_ptr<className>(new className(initializers));
functionCall(p);
现在处理内存的所有权。 shared_ptr 拥有内存,并保证它会被释放。当然,我们可以改用 std::auto_ptr,但是 shared_ptr 实现了您通常期望的语义。
请注意,我仍然在单独的一行上分配内存,因为在进行函数调用时在同一行上进行多次分配的问题仍然存在。其中一个可能仍然会抛出异常,然后你就泄漏了内存。
智能指针通常是处理内存管理所需的绝对最小值。 但通常,不错的解决方案是编写您自己的 RAII 类。
className 应该在堆栈上分配,并在其构造函数中,使用 new 进行必要的分配。在其析构函数中,它应该释放该内存。这样,您就可以保证不会发生内存泄漏,并且可以像这样简单地调用函数:
functionCall(className(initializers));
C++ 标准库是这样工作的。 std::vector 就是一个例子。您永远不会使用 new 分配 vector 。您在堆栈上分配它,并让它在内部处理其内存分配。
关于c++ - 将新分配的数据直接传递给函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/398543/
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
通过rubykoans.com,我在about_array_assignment.rb中遇到了这两段代码你怎么知道第一个是非并行赋值,第二个是一个变量的并行赋值?在我看来,除了命名差异之外,代码几乎完全相同。4deftest_non_parallel_assignment5names=["John","Smith"]6assert_equal["John","Smith"],names7end45deftest_parallel_assignment_with_one_variable46first_name,=["John","Smith"]47assert_equal'John
我想在一个没有Sass引擎的类中使用Sass颜色函数。我已经在项目中使用了sassgem,所以我认为搭载会像以下一样简单:classRectangleincludeSass::Script::FunctionsdefcolorSass::Script::Color.new([0x82,0x39,0x06])enddefrender#hamlengineexecutedwithcontextofself#sothatwithintemlateicouldcall#%stop{offset:'0%',stop:{color:lighten(color)}}endend更新:参见上面的#re
我正在尝试用ruby中的gsub函数替换字符串中的某些单词,但有时效果很好,在某些情况下会出现此错误?这种格式有什么问题吗NoMethodError(undefinedmethod`gsub!'fornil:NilClass):模型.rbclassTest"replacethisID1",WAY=>"replacethisID2andID3",DELTA=>"replacethisID4"}end另一个模型.rbclassCheck 最佳答案 啊,我找到了!gsub!是一个非常奇怪的方法。首先,它替换了字符串,所以它实际上修改了
我有一些代码在几个不同的位置之一运行:作为具有调试输出的命令行工具,作为不接受任何输出的更大程序的一部分,以及在Rails环境中。有时我需要根据代码的位置对代码进行细微的更改,我意识到以下样式似乎可行:print"Testingnestedfunctionsdefined\n"CLI=trueifCLIdeftest_printprint"CommandLineVersion\n"endelsedeftest_printprint"ReleaseVersion\n"endendtest_print()这导致:TestingnestedfunctionsdefinedCommandLin
有时我需要处理键/值数据。我不喜欢使用数组,因为它们在大小上没有限制(很容易不小心添加超过2个项目,而且您最终需要稍后验证大小)。此外,0和1的索引变成了魔数(MagicNumber),并且在传达含义方面做得很差(“当我说0时,我的意思是head...”)。散列也不合适,因为可能会不小心添加额外的条目。我写了下面的类来解决这个问题:classPairattr_accessor:head,:taildefinitialize(h,t)@head,@tail=h,tendend它工作得很好并且解决了问题,但我很想知道:Ruby标准库是否已经带有这样一个类? 最佳
我早就知道Ruby中的“常量”(即大写的变量名)不是真正常量。与其他编程语言一样,对对象的引用是唯一存储在变量/常量中的东西。(侧边栏:Ruby确实具有“卡住”引用对象不被修改的功能,据我所知,许多其他语言都没有提供这种功能。)所以这是我的问题:当您将一个值重新分配给常量时,您会收到如下警告:>>FOO='bar'=>"bar">>FOO='baz'(irb):2:warning:alreadyinitializedconstantFOO=>"baz"有没有办法强制Ruby抛出异常而不是打印警告?很难弄清楚为什么有时会发生重新分配。 最佳答案
我没有找到太多关于如何执行此操作的信息,尽管有很多关于如何使用像这样的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
我正在使用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”以实现该目的?如果我想通过传递一些