是否可以使用「new」運算符分配任意內存塊?在C中,我可以像「void * p = malloc(7);」 - 如果內存對齊設置爲1個字節,則會分配7個字節。如何使用新操作符在C++中進行相同操作?C++中的內存分配
回答
任意存儲器塊可以在C++ operator new
被分配;而不是用於構建對象的new
運算符。
void* pBlock = ::operator new(7);
此類塊隨後可以用operator delete
釋放。
::operator delete(pBlock);
注意operator new
將分配的內存爲任何類型的對象適當地對齊,因此實現可能不分配整整7個字節,並沒有更多的,但相同的是(通常)的malloc
如此。 C客戶端malloc
通常也需要對齊的內存。
不能分配void
指針與C++的操作new
:你必須分配一個明確的類型,如char
或uint8_t
:
char *p = new char[7];
uint8_t *q = new uint8_t[7];
...
delete [] p;
delete [] q;
我想你可能會尋找Placement New。
new char [7];
傳統,char是一個字節,雖然你可能會發現有些庫的typedef一個BYTE類型。
你可以做char* pBuffer = new char[7];
,而且由於的sizeof(char)的1個字節你可以使用它作爲一個字節的緩衝區。另外,請記住在釋放內存時使用delete[]
(帶[])。
其他人已經回答了這個問題所寫,但我想建議使用malloc /免費提供這樣的分配堅持。
新增和刪除用於分配對象。他們分配所需的內存並調用構造函數/析構函數。如果你知道你只需要一個任意的內存塊,使用malloc和free是完全合理的。
是的,你可以。
但是,根據你在做什麼,可能會有更好的技術。
可以更新的問題,並告訴我們你想達到的目標。在更多情況下,可以提供更好的解決方案。
示例:
如果您是動態分配緩衝區以從套接字讀取(因爲在編譯時未知大小)。另一種方法是使用矢量並動態調整大小。然後,您可以通過獲取第一個元素的地址來獲取指向緩衝區內部的指針。
個人而言,我會用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>
暗示」此對象包含任意字節組「。
- 1. C中的內存分配
- 2. C++中的內存分配
- 3. 內存分配C++
- 4. 內存分配,C++
- 5. C內存分配
- 6. C++分配內存
- 7. 內存分配C
- 8. C中的免費C分配內存#
- 9. 在C/C++中的內存分配
- 10. 在C++中用void *分配內存結構內存分配
- 11. C++內存分配在C
- 12. 在C/C++中分配內存失敗
- 13. C中的數組的內存分配
- 14. C++內存分配 - 分配子類到
- 15. 內存泄漏在C /內存分配++
- 16. C中的空閒分配內存
- 17. C中的內存管理(分配)
- 18. 將內存分配給C++中的char *
- 19. c中線程的內存分配
- 20. C++中的指針內存分配
- 21. C++中的結構內存分配
- 22. 目標C中的內存分配
- 23. C++中的動態內存分配
- 24. C中的malloc內存分配方案
- 25. C++中線程的內存分配
- 26. C程序中的內存分配
- 27. C中矩陣的內存分配
- 28. C中的內存分配和指針
- 29. 內存分配與C中的節點
- 30. C內存分配錯誤
我只會補充一點,如果您打算使用安置新的技巧,您必須小心。只有在真正需要時才使用它! – 2009-07-02 15:52:19
放置新內容如何與分配內存有關? – avakar 2009-07-02 16:03:33
@Miky D:我同意,這就是爲什麼鏈接頁面全部大寫字母都是「DANGER」字樣的原因。 :-) – 2009-07-02 16:07:39