为什么使用new运算符而不是std :: vector?

时间:2016-09-08 12:06:00

标签: c++ c++11 new-operator stdvector

delete运算符经常让我感到困惑,如果我忘记使用std::vector,使用它会导致内存泄漏。每次我必须在编译时分配一个对象数组而不知道它的长度时,我只使用new。使用new有什么意义?

另外,为什么我需要使用def print_report(self, cr, uid, ids, context=None): datas = {} a=[] print "---------------------------------------------------------------" for phone in self.browse(cr, uid, ids, context=context): b=phone.selection_item print b if context is None: context = {} datas['ids'] = context.get('active_ids', []) datas['model'] = context.get('active_model', 'ir.ui.menu') datas['value']=b context.update({'names':b}) return { 'type': 'ir.actions.report.xml', 'report_name': 'sales_invoice.report_mom', 'datas': datas, 'context':context} 运算符为一个对象的单个实例分配空间?

4 个答案:

答案 0 :(得分:4)

你是对的。裸体class H2(a:String, implicit val b: Int) { //Working } class H3(implicit a:String, implicit val b: Int) { //Working } evil

它的主要目的是现在是高级构造下面的低级管道。所有newvector都会在标准库的深处调用make_unique

此外,低级别部分优先于高级别部分。在智能指针之前,new是许多情况下唯一的选择。事实上,new仅在C ++ 14中引入,因此即使使用std::make_unique进行资源清理,即使C ++ 11也需要调用new

答案 1 :(得分:2)

要在大多数代码中正常使用动态数组,请使用new。这显然是默认设置,可以防止出现许多问题。

但是,当您知道自己在做什么并希望在特殊情况下获得某些性能提升时,您可能希望了解mallocstd::vector是否可以为您提供帮助。最好是制作一个新的专用容器,这样人们就可以继续使用它作为普通容器。或者甚至更好,您可以尝试为现有容器制作分配器。您可能已经注意到,这需要一些时间并且可能需要调试,因此除非有实际需要,否则坚持使用标准容器和动态数组,这是MAC Text: Hypertension, Stage 1 - Systolic 140-159 or diastolic 90-99 | | WINDOWS/HTML Text: Hypertension, Stage 1 - Systolic 140Ð159 or diastolic 90Ð99

答案 2 :(得分:1)

始终更喜欢标准容器。它们具有明确定义的复制语义,异常安全,并且可以正确释放。

由value(即堆栈)创建的对象在超出范围时自动死亡。析构函数调用由编译器插入,并在函数返回时自动释放内存。

请注意,C ++不是垃圾回收。因此,对于每个new,必须有相应的delete。如果你没有把这个delete放入,那么你就会有内存泄漏。

答案 3 :(得分:1)

我认为你的问题与两件事有关:

  1. new运算符的用法:我只想举个例子。使用“new”和“delete”管理内存使程序员可以控制程序。有些程序语言有垃圾收集,但我们不知道GC何时会起作用,这会导致不确定性。但是,对于需要低延迟的系统,这种不确定性会带来麻烦。

  2. 使用“vector”,我们不必使用new创建动态数组,这样可以减少错误。实际上使用向量而不是动态数组是好的。但我不认为vector的使用与使用new有冲突。只有这样才能避免使用新的情况。

  3. 请检查RAII的概念。它对学习C ++很有用。