2014-07-09 32 views
0

我的回答here收到了關於我的代碼中的內存分配的評論。我已經使用new[]delete[],因爲我之前讀過,您絕對不應該在C++中使用malloc()/free()(即here)。有問題的代碼基本上是:爲PODs正確分配內存

ULONG outBufLen = sizeof(IP_ADAPTER_ADDRESSES); 
GetAdaptersAddresses(0, 0, NULL, NULL, &outBufLen); 
PIP_ADAPTER_ADDRESSES pCurrAddresses = (IP_ADAPTER_ADDRESSES *)new uint8_t[outBufLen]; 
//... 
delete[] pCurrAddresses; 

的內存字節大小,這是我要分配來自功能GetAdaptersAddresses()。 我的問題是:這段代碼有什麼問題嗎?如果是的話,現代C++的合適方式是在那裏分配內存?

  • malloc()/free()應該是不成問題的 - 這是C++代碼,我沒有看到在使用malloc()代替new[]這裏任何改善。對?

  • std::vector<>似乎不是我的權利 - 我可以寫std::vector<uint8_t> bytes(outBufLen, 0); PIP_ADAPTER_ADDRESSES pCurrAddresses = (IP_ADAPTER_ADDRESSES *)bytes.data();但我有一個壞的 感覺,因爲std::vector<>::data()是常數)。

  • 使用std::unique_ptr<uint8_t[]>似乎也很奇怪 - 因爲無論如何我必須將它轉換爲原始指針。

任何替代品?

+1

'std :: vector :: data()'只有在'const'向量上調用時才返回'const T *'。否則,調用非''constst'超載,返回'T *'。 –

回答

1

在大多數情況下,您的第二個建議是std::vector是C++中的正確​​選項。 data()不是常量(好吧,它是const vector,但在你的情況下不是)。 C++標準確保data()返回指向您的POD的連續內存存儲器的指針。