2014-05-25 80 views
1

在使用new分配对象内部使用'new'分配内存是否有任何影响?编译器,链接器,运行时性能或其他方面是否有优势或劣势?动态分配对象内的动态分配

什么我谈论

class IntData 
{ 
public: 
    IntData() 
    { 
     IntVector = new std::vector<int>(); 
     //... 
    } 

protected: 
    std::vector<int> *IntVector; //Would this be any different to static allocation if... 
}; 

//...I know that all IntData objects will be dynamically allocated 
IntData *object = new IntData(); 
+1

'intVector的=新的std ::矢量();'没有任何好处超过只是说'的std ::矢量 IntVector;' –

+0

使用* IntVector只是添加一个间接的水平....就是这样。 – sunny1304

+1

没有使用这种方法的问题。作为性能,运行时间 - 这取决于最终的设计和算法,很难说 – NirMH

回答

1

使用

std::vector<int> IntVector; 

你给自动存储到矢量(的一个例子,即如果在一个函数这将是对堆栈空间,在一个类的成员的情况下,它取决于如何分配父对象..在上例中:在堆上)

usin摹

IntVector = new std::vector<int>(); 

你完全在堆中分配的对象包括几个容器的内部数据(对象将始终在堆上复制)。

这是否值得去做?

对于一小堆字节:通常没有。此外,您需要自己拨打delete来记忆自己的记忆。可能不是问题,但在上面的简单情况下,我没有理由这样做。


还涉及到一个更一般的情况:STL containers on the stack and the heapObject creation on the stack/heap?

+0

“STL标题”是指'vector'里面的变量? “标题”一词在这里似乎有误导性。此外,只有'vector'内的对象总是在堆上,所以将对象放在堆栈上或任何你想要的地方是可能的和有用的。另外,您可以通过使用'unique_ptr'来避免手动记账。 – nwp

+0

我同意这个术语可能会引起误解,我会将其编辑为更一般的。也同意智能ptrs,但是这是上面简单的代码中并不严格需要的东西。 –