首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C++ GlobalAlloc 返回 void* 賦值給長整型指針報錯的解決方法

     編輯:程式設計綜合問答

錯誤代碼

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 釋放,否則內存洩漏。
  • 現代 C++ 建議使用 std::vector<BYTE>、std::unique_ptr 或 HeapAlloc 替代全局堆函數,更安全、异常安全。

圖片參考

編譯錯誤截圖

總結

C2440 錯誤因 void* 不能隱式轉換為 long*。顯式 static_cast 或 C 風格強轉即可解決。同時建議使用 GMEM_FIXED 並配合 RAII 管理內存生命周期。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved