long *p;
p = ::GlobalAlloc(0, Length); // error C2440: '=' : cannot convert from 'void *' to 'long *'
GlobalAlloc 返回 HGLOBAL(本質是 void*),C++ 強類型系統不允許隱式將 void* 轉換為其他具體指針類型(C 語言允許)。必須顯式強制類型轉換。
long *p = static_cast<long*>(::GlobalAlloc(GMEM_FIXED, Length));
// 或 C 風格轉換
long *p = (long*)::GlobalAlloc(GMEM_FIXED, Length);
注意:第一個參數建議使用 GMEM_FIXED(返回指針)而非 GMEM_MOVEABLE(返回句柄,需 GlobalLock 才能獲取指針),除非你明確需要可移動內存。
CFile file(_T("c:\\Iris.txt"), CFile::modeRead);
DWORD length = file.GetLength();
long *p = (long*)::GlobalAlloc(GMEM_FIXED, length);
if (p) {
file.Read(p, length); // 讀取數據到分配的內存
// 使用 p...
::GlobalFree(p); // 釋放
}
file.Close();
GlobalAlloc 返回 void*,賦值給具體指針必須強轉。GMEM_FIXED 直接獲取指針,避免 GlobalLock/GlobalUnlock 管理麻煩。GlobalFree 釋放,否則內存洩漏。std::vector<BYTE>、std::unique_ptr 或 HeapAlloc 替代全局堆函數,更安全、异常安全。
C2440 錯誤因 void* 不能隱式轉換為 long*。顯式 static_cast 或 C 風格強轉即可解決。同時建議使用 GMEM_FIXED 並配合 RAII 管理內存生命周期。