2009-07-02 165 views
8

是否可以使用「new」運算符分配任意內存塊?在C中,我可以像「void * p = malloc(7);」 - 如果內存對齊設置爲1個字節,則會分配7個字節。如何使用新操作符在C++中進行相同操作?C++中的內存分配

回答

43

任意存儲器塊可以在C++ operator new被分配;而不是用於構建對象的new運算符。

void* pBlock = ::operator new(7); 

此類塊隨後可以用operator delete釋放。

::operator delete(pBlock); 

注意operator new將分配的內存爲任何類型的對象適當地對齊,因此實現可能不分配整整7個字節,並沒有更多的,但相同的是(通常)的malloc如此。 C客戶端malloc通常也需要對齊的內存。

8

不能分配void指針與C++的操作new:你必須分配一個明確的類型,如charuint8_t

char *p = new char[7]; 
uint8_t *q = new uint8_t[7]; 
... 
delete [] p; 
delete [] q; 
2

我想你可能會尋找Placement New

+1

我只會補充一點,如果您打算使用安置新的技巧,您必須小心。只有在真正需要時才使用它! – 2009-07-02 15:52:19

+5

放置新內容如何與分配內存有關? – avakar 2009-07-02 16:03:33

+0

@Miky D:我同意,這就是爲什麼鏈接頁面全部大寫字母都是「DANGER」字樣的原因。 :-) – 2009-07-02 16:07:39

2

new char [7];

傳統,char是一個字節,雖然你可能會發現有些庫的typedef一個BYTE類型。

2

你可以做char* pBuffer = new char[7];,而且由於的sizeof(char)的1個字節你可以使用它作爲一個字節的緩衝區。另外,請記住在釋放內存時使用delete[](帶[])。

11

其他人已經回答了這個問題所寫,但我想建議使用malloc /免費提供這樣的分配堅持。

新增和刪除用於分配對象。他們分配所需的內存並調用構造函數/析構函數。如果你知道你只需要一個任意的內存塊,使用malloc和free是完全合理的。

3

是的,你可以。
但是,根據你在做什麼,可能會有更好的技術。

可以更新的問題,並告訴我們你想達到的目標。在更多情況下,可以提供更好的解決方案。

示例:
如果您是動態分配緩衝區以從套接字讀取(因爲在編譯時未知大小)。另一種方法是使用矢量並動態調整大小。然後,您可以通過獲取第一個元素的地址來獲取指向緩​​衝區內部的指針。

3

個人而言,我會用std::vector<char>。你不僅可以得到任意字節塊(guaranteed to be contiguous),你可以將它們放在RAII包裝中。當然,沒有必要使用任何std::vector的方法(除了,也許,resize()),但沒有處罰爲:

std::vector<char> buffer(7); 
void* p = &buffer[0]; 

你可以使用一個std::string,但std::string暗示「這個對象包含打印出來時有意義的字符「,其中std::vector<char>暗示」此對象包含任意字節組「。