2010-09-16 49 views
0

我想製作一個程序,讓我們說代表一個矩陣 現在矩陣將由一個向量表示,向量中的每個對象將以 表示一個單元示例:現在向量 當構造矩陣時,構造函數接收要插入矩陣中的單元列表。 編譯時的列表大小未知編譯時間在C++中創建不使用「新」的對象

我有興趣創建此矩陣,而不使用堆上的內存。換句話說,如果我不知道要將多少個對象插入到向量中,那麼是否有任何方法可以使用「new」或「delete」來創建對象?

+11

_你爲什麼反對在堆上分配這個對象?這就是堆(至少,主要的東西之一)。 – 2010-09-16 23:20:06

+0

爲什麼你認爲避免堆是個好主意?如果矩陣非常大且不稀疏,從而無法適應堆棧呢? – 2010-09-16 23:21:34

+0

除非你有避免使用'new'的非常具體的原因,這聽起來像是一個想法。 – 2010-09-16 23:25:20

回答

1

如果不使用匯編指令對程序/函數的堆棧幀進行直接(因此依賴於平臺)操作,沒有標準的方法來做到這一點 - 我會衷心勸阻。什麼阻止你使用堆?

1

使用alloca獲得一個指針,然後使用就地new操作:

void *p = alloca(sizeof(Class)); 
new (p) Whatever(arguments); 

然而,使用前閱讀alloca手冊! 非常小心。正如Jim Brissom所說,alloca不便攜。

您不需要delete。當函數返回時內存將被釋放

+4

alloca並非完全可移植... – 2010-09-16 23:23:59

+0

將這種資源管理包起來。手工做內存管理==不好。 – GManNickG 2010-09-16 23:24:11

+0

拋開可移植性的擔憂,是由'alloca'返回的指針保證爲'Whatever'正確對齊? – 2010-09-16 23:25:11

1

有一種方法,它非常有限,非常非正統。您需要創建一個形成內存池的靜態大小的數組unsigned char。對象列表的大小將會受到限制。您需要將該類的new運算符(和delete運算符)重載爲專門針對此類內存池的運算符。

這就是說,這條路線確實沒有什麼好的理由。

+0

IIRC,如您所描述的放置新內容在Windows打印機DDK中很常見。 – mkb 2010-09-16 23:27:31

+0

事實上,我認爲這是一個正確的方法,把一個對象堆放在一個無法分頁的位置,如果這是必要的。 – mkb 2010-09-16 23:31:19

1

那麼,如果你不想在堆上使用內存,你想從哪裏獲得?

a)系統相關 - 您可以要求操作系統爲您分配一些內存。但這是糟糕的風格(依賴於系統),並且會使用相同的RAM ......只是以不同的方式分配。例如,如果您真的對此感興趣,Windows 32中的:: GlobalAlloc或:: LocalAlloc將執行此類操作。

b)內存映射文件 - 如果您問,因爲您認爲內存不足並且訪問時間不成問題,這可能很有趣。

c)使用像malloc/free這樣的C函數並投射指針......從堆中獲取內存,避免使用「新」和「刪除」關鍵字。

但是,很難說沒有信息的「好」解決方案爲什麼要避免新增/刪除。 你需要動態內存分配,這兩個是做這些的工具。

您能否解釋/改述您的問題,以便您可以得到更準確的答案?

2

有一種特殊的方式可以使用new來分配堆棧中的內存或作爲靜態存儲使用所謂的放置新運算符。有了這個新版本,你可以保留一大塊內存,並且你明確地告訴你新的存儲特定變量的位置。它的工作如下:

#include <new> 
    int main() 
    { 
     char buffer[500]; // chunk of memory 
     int p*; 
     p = new (buffer) int[10]; 
    } 

請注意,您需要在爲了使用這個特殊的新運營商頭。在這種情況下,當您使用自動存儲時,內存將在離開聲明的塊(主)後釋放。

參考文獻:C++ Primer plus。第9章。Page 420

+0

'buffer'不保證適合'int'對齊。 – 2010-09-17 00:00:36

+0

感謝您的提示。看到這本書中的例子,感覺很奇怪:) – Vintharas 2010-09-17 00:29:05

+1

但是這個使用了'new'這個詞。 OP不需要'新'性或'刪除'性。現在不降價! – Chubsdad 2010-09-17 03:50:02