2014-05-25 123 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,但是這是上面簡單的代碼中並不嚴格需要的東西。 –