C 開發DLL中使用new和delete注意事項

2021-07-24 13:04:52 字數 1121 閱讀 2509

報錯情況

:1,在 dll 中用 new 來建立宿主程式中的物件,然後把這個物件指標儲存到宿主程式,當 dll 被解除安裝後,凡是涉及到這個指標的呼叫都會報錯,包括 delete 這個指標也會有錯。

2,在dll中new出乙個物件,然後在不需要使用時進行delete,結果會報如下錯誤:

分析原因

:因為new/delete使用的是區域性堆(當然這與編譯器可能也有關,但至少m$的編譯器應該是這樣的),也就是說不同的dll雖然共享乙個位址空間,但完全可能會維護不同的區域性堆(堆分段),這與編譯器的實現有關。有些編譯器可以選擇使用程序共享的區域性堆,但效能會受影響。

如果是不同的區域性堆,當你在dll中new時,是在dll的堆中分配的;而當你在exe中delete時,exe會認為它是在exe的區域性堆中分配的,從而用exe的堆資訊去釋放它,從而可能導致錯誤。具體情況與堆管理**的實現有關。

解決辦法

1、為class或struct提供乙個虛的create/free方法,在裡面呼叫new/delete。不管是從exe中分配的還是從dll中分配的,都可以安全地用create方法建立/free方法釋放,因為create/free是虛的,它的**會和分配它的**編譯在同乙個可執行體中。

2、用globalalloc()和globalfree()代替new和delete。

3、用動態庫版本的c run-time library可以解決這個問題。

在project->setting->c/c++->category中選code generation,然後在use run-time library中選debug multithreaded。

4、過載new/delete操作符。

C 中使用new和malloc注意事項

先測試如下帶引數的建構函式 class test private int num 可以看到其建構函式帶乙個引數,並且在前導中執行私有變數 num的初始化操作,函式體中列印提示資訊。下面時主函式。int main 程式執行結果如下。created test with 10 請按任意鍵繼續.可以看出其執...

c 中使用new來分配記憶體

指標初始化為變數的位址,比如 int pt higgens 這時候變數在程式編譯的時分配的有名稱的記憶體,指標只是為可以通過名稱直接訪問的記憶體提供乙個別名。其實指標真正的厲害在於,在執行階段分配未命名的記憶體以儲存,在這種情況下,只能通過指標來訪問記憶體 在c語言中,可以用庫函式malloc 來分...

c 中使用new動態分配儲存空間

下面這個例子,檢驗new給double型陣列分配的儲存空間的首位址是多少。s是指向這個陣列的指標,s 1即是指標移動一位,指向下乙個元素。root sparkmaster test cat newarray.cpp include int main double s int i s new doub...