Rody
Lv 5
Rody 發問時間: 電腦與網際網路程式設計 · 1 0 年前

VC寫的dll當中,記憶體管理的問題

最近在利用VC來寫dll,當中使用到動態記憶體配置的一些程式碼﹙new,delete﹚,但是發生一件很詭異的事情,就是程式編譯完成都沒問題﹙沒有語法上的錯誤﹚,但是在我使用別的程式呼叫這個dll裡面的函式時,如果函式裡面有用到delete和new,幾乎非常容易當掉,因為當時在查問題,利用MsgBox的方式來監控程式執行到哪邊當掉,結果發現每次都是死在delete或是new的地方,我的呼叫其實很簡單,就像這樣typedef struct tABC{long A,B,C,D;//實際上我就是用這麼多東西}ABC;...ABC *tt;tt=new ABC [100];//這裡就會死掉delete [] tt;//這裡也死了幾次這樣的動態記憶體應該不算大,結構也才 16 Bytes,宣告 100 個也才 1600 Bytes,如果這樣都會死掉,那就根本沒辦法使用動態記憶體啦~~PS: 最後為了解決問題,我全部的陣列都改成靜態記憶體宣告,直接宣告一個看來夠大的記憶體,而不使用動態配置,但是這樣的寫法很笨,而且沒有彈性,所以想知道這問題有沒有辦法解決?

已更新項目:

感謝 QOO和龍的回覆,順便說一下,我的new 和 delete 都是在函式當中進行,在dll中的韓是只有宣告一個class物件,物件裡面有個指標,建構的時候將指標設定為0,呼叫某個函式的時候會檢查指標如果不是0,就進行 delete指標的動作,然後根據呼叫的設定來決定產生多大的動態記憶體,在delete的時候會死掉

另外上面那段在new ABC[10]的時候是OK的,delete也沒問題,但是 new ABC [100]就掛了

還有,這個VC寫的dll是給VB呼叫用的,我不知道這有沒有關係;另外,再次感謝您的回應

3 個解答

評分
  • SiYu
    Lv 5
    1 0 年前
    最佳解答

    小弟我寫了如下的程式用VC++6.0 寫的

    DLL 部份

    // abc.cpp : Defines the entry point for the DLL application.

    //

    #include "stdafx.h"

    BOOL APIENTRY DllMain( HANDLE hModule,

    DWORD ul_reason_for_call,

    LPVOID lpReserved

    )

    {

    return TRUE;

    }

    typedef struct tABC{

    long A,B,C,D;

    }ABCD;

    __declspec( dllexport ) ABCD* MakeABC(int a_nSize)

    {

    return new ABCD[a_nSize];

    }

    __declspec( dllexport ) void DeleteABC(ABCD* a_pABC)

    {

    delete [] a_pABC;

    }

    叫用DLL 的部份

    typedef struct tABC{

    long A,B,C,D;

    }ABCD;

    __declspec( dllimport ) ABCD* MakeABC(int a_nSize);

    __declspec( dllimport ) void DeleteABC(ABCD* a_pABC);

    int main()

    {

    ABCD *p=MakeABC(10000); // 叫用DLL 中的MakeABC 產生10000個ABCD

    for( int i = 0 ; i < 10000 ; ++i)

    p->A=0;

    DeleteABC(p); // 呼叫DLL 中的DeleteABC

    return 0;

    }

    並不會出現code dump

    所以. 不知道妳的程式的複雜到什麼樣的成度. 只能給妳一個小小的程式範例.

    2006-03-29 20:30:29 補充:

    給VB 用是可以的. 不過要記得function 要加上__stdcallfor example C/C++ 的dll 檔#include <stdio.h>int __stdcall CheckSum(const char* a_zFile){return 100;}

    2006-03-29 20:30:49 補充:

    令外在寫一個.def 檔如下LIBRARY "VBDLL"DESCRIPTION 'Windows Dynamic Link Library'EXPORTS CheckSum @1 privateVB 中要寫如下Public Declare Function CheckSum Lib "VBDLL.dll" (ByVal s As String) As Long最大最大的重點是c 的function 一定要加上__stdcall

    參考資料: me .
  • 匿名使用者
    7 年前

    →電腦筆電維修~電腦重灌~電腦組裝~重灌win7~xp重灌~

    →電腦中毒~電腦無法開機~電腦變慢~

    →筆電win8改win7~MAC改win7 or 雙系統

    ◎◎◎各式各樣電腦問題,問他們就對了◎◎◎

    →他們會很快解決你的問題 也可以免費諮詢喔!

    →北市可以到府收送喔!評價很高

    我有認識電腦公司-金滿意電腦

    收費便宜●技術超好●修不好不收費

    有需要可以打電話詢問

    電話:02-29405818或者●加LINE~直接線上詢問

    ID:gmepc168

    希望能幫到你

    Yahoo服務加網址

    http://tw.serviceplus.yahoo.com/booth/seller/Y0193...

  • Lv 7
    1 0 年前

    看不出哪裡會當.你可在tABC裡寫一個constructor和destructor.看看new和delete有無執行到你寫的constructor和destructor.

還有問題?馬上發問,尋求解答。