c/c++運行期庫的使用

本次介紹關於c/c++運行庫的一些重要的內容
很多人在使用malloc,free函數時,會經常出現內存錯誤
比如下面的源碼

void ExeFunc()
{
    PVOID pv=DLLFunc();
    free(pv);
}

PVOID DLLFunc()//這個函數的源代碼在DLL中
{
    return malloc(100);
}

那麼這個代碼能夠正常運行嗎?答案是不確定
1.假如exe鏈接的是動態運行庫,dll鏈接的也是動態運行庫,那麼這個代碼是可以正常運行的
2 如果exe和dll鏈接的庫不同,那麼,這個代碼不能正常運行
3 如果exe和dll鏈接的都是靜態的,那麼這個代碼也不能正常運行

我們說說爲什麼
一個進程的所有線程共享一個堆
malloc和free都是從堆上分配空間,如果malloc和free不是同一個堆,自然會出錯
假如exe和dll鏈接的都是c/c++運行期庫的動態庫,那麼沒關係,因爲他們共用一個dll,所以堆是相同的,自然沒問題
假如exe和dll鏈接的庫不一樣,鏈接靜態庫的那個使用的是自己的堆,鏈接動態庫的那個使用的是dll的堆,堆不一樣,肯定有問題
假如exe和dll鏈接的是相同的靜態庫,靜態庫就是把運行庫的代碼完全加載到各自的模塊中,也就是,他們使用的是自己的堆,也就是說exe使用的是exe的堆,dll使用的是dll的堆,堆也不一樣,自然會有問題

正確的做法是誰分配誰釋放,只要分配和釋放在同一個堆中就沒有問題

void ExeFunc()
{
    PVOID pv=DLLFunc();
    DLLFreeFunc(pv);
}

PVOID DLLFunc()//這個函數的源代碼在DLL中
{
    return malloc(100);
}

BOOL DLLFreeFunc(PVOID pv)
{
    return (free(pv));
}

這樣不管什麼情況下都不會出問題了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章