我在Jeffrey Richter和Christophe Nasarre的C++中,通過Windows的書中的筆記發現了這個問題。當與靜態c運行時鏈接時的內存分配/釋放問題
檢查下面的代碼: V
OID EXEFunc() {
PVOID pv = DLLFunc();
// Access the storage pointed to by pv...
// Assumes that pv is in EXE's C/C++ run-time heap
free(pv);
}
PVOID DLLFunc() {
// Allocate block from DLL's C/C++ run-time heap
return(malloc(100));
}
所以,你有什麼感想?前面的代碼是否正確工作?由EXE的函數釋放的 DLL函數分配的塊是否被分配?答案是:也許。顯示的代碼不是 會給你足夠的信息。如果EXE和DLL鏈接到DLL C/C++運行庫 庫,代碼工作得很好。但是,如果其中一個或兩個模塊鏈接到靜態C/C++運行時庫,則釋放調用失敗。
我無法理解,在將模塊鏈接到靜態C運行庫時,爲什麼免費調用會失敗。
有人可以解釋爲什麼免費失敗? 發現類似的問題在這裏: Memory Allocation in Static vs Dynamic Linking of C Runtime
但我在這裏已經同疑問MrPhilTx: 難道所有的堆在同一個地址空間?
謝謝!
即使鏈接到EXE和DLL的運行時代碼是相同的,但存在單獨的元數據副本這一事實會攪亂一切。分配在一堆並釋放到另一堆會導致一個大混亂。 –