請問有關DLL中的動態二維陣列釋放的問題! |
答題得分者是:arisaka_matsuri
|
l90425
初階會員 發表:95 回覆:152 積分:49 註冊:2008-04-03 發送簡訊給我 |
請問各位大大DLL.cpp中的Q參數最後當執行到FreeLibrary(dllInstance);這一行會自動釋放嗎?
如果不行,請問應該如何做才能釋放Q參數呢? 請各位大大指導一下!謝謝! 謝謝!謝謝! 主程式 main.cpp [code cpp] void __fastcall TForm1::Button1Click(TObject *Sender) { HINSTANCE dllInstance = LoadLibrary("pdll.dll"); double** (*Matrix)(double [9]); (FARPROC &)Matrix = GetProcAddress( dllInstance, "Matrix"); double** F = new double*[6]; for(int i=0;i<6;i ) F[i]=new double[6]; F=Matrix(g); for(int i = 0; i<6; i ) delete [] F [i]; delete F; FreeLibrary(dllInstance); } [/code] DLL檔 DLL.cpp [code cpp] double** __stdcall Matrix(double matrix[9]) { double** Q = new double*[6]; for(int i=0;i<6;i ) Q[i]=new double[6]; ...... return Q; } [/code]
------
-謝謝大大熱心的回覆!謝謝! 編輯記錄
l90425 重新編輯於 2008-12-26 12:38:27, 註解 無‧
|
arisaka_matsuri
高階會員 發表:25 回覆:205 積分:231 註冊:2003-10-19 發送簡訊給我 |
你好
「Q參數最後當執行到FreeLibrary(dllInstance);這一行會自動釋放嗎?」 答案是:不會! 使用dll配置動態記憶體空間時,把握一個重要的觀念 你必須在同一個dll裡把它釋放掉 舉例來說,由dll配置的Q,就要由一個在該dll裡的函式釋放掉 如果不這麼做,正常來說會導致程式執行時崩潰 不正常的情況下,會看起來沒事,但絕對是個未爆彈 想知道更深入的原因,可以上網搜尋 allocate memory in dll 需要具備windows記憶體管理的背景 另外,在你的main.cpp第7~15行的寫法怪怪的 一些動態記憶體使用與指標的觀念不太對 可能翻翻書比較有幫助 舉個例子(程式碼僅示意) main.cpp [code cpp] ... double **ptr_array = DllAlloc(); ... DllDealloc(ptr_array); ... [/code] dll.cpp [code cpp] double **DllAlloc(void) { double **Q = new ... return Q; } void DllDealloc(double **_ptr) { for(...) { delete [] _ptr[i]; } delete [] _ptr; } [/code] |
l90425
初階會員 發表:95 回覆:152 積分:49 註冊:2008-04-03 發送簡訊給我 |
謝謝大大的提醒!我知道大大的意思了!
確實有問點問題,非常感謝大大說明! 謝謝!謝謝! 若修改後還有問題請多多提醒一下! ===================引 用 arisaka_matsuri 文 章=================== 另外,在你的main.cpp第7~15行的寫法怪怪的 一些動態記憶體使用與指標的觀念不太對 可能翻翻書比較有幫助 ============================================================ 修改後 main.cpp [code cpp] void __fastcall TForm1::Button1Click(TObject *Sender) { HINSTANCE dllInstance = LoadLibrary("pdll.dll"); double** (*StiffnessMatrix)(double [9]); (FARPROC &)StiffnessMatrix = GetProcAddress( dllInstance, "Matrix"); void (*Dllmemory)(double **ptr,int size); (FARPROC &)Dllmemory = GetProcAddress( dllInstance, "Dllmemory"); double** Q=Matrix(g); for(int i=0;i<6;i ) for(int j=0;j<6;j ) F[i][j]=Q[i][j]; Dllmemory(Q,6); FreeLibrary(dllInstance); } [/code] dll.cpp [code cpp] double** __stdcall Matrix(double matrix[9]) { double** Q = new double*[6]; for(int i=0;i<6;i ) Q[i]=new double[6]; ...... return Q; } void __stdcall Dllmemory(double **k,int size) { for(int i = 0; i delete [] k; } [/code]
------
-謝謝大大熱心的回覆!謝謝! |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |