全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1620
推到 Plurk!
推到 Facebook!

請問有關DLL中的動態二維陣列釋放的問題!

答題得分者是:arisaka_matsuri
l90425
初階會員


發表:95
回覆:152
積分:49
註冊:2008-04-03

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-12-26 12:37:45 IP:59.125.xxx.xxx 未訂閱
請問各位大大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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-12-28 22:43:01 IP:140.113.xxx.xxx 訂閱
你好

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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-12-29 18:12:33 IP:59.125.xxx.xxx 未訂閱
謝謝大大的提醒!我知道大大的意思了!
確實有問點問題,非常感謝大大說明!
謝謝!謝謝!
若修改後還有問題請多多提醒一下!
===================引 用 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; idelete [] k [i];
delete [] k;
}

[/code]

------
-謝謝大大熱心的回覆!謝謝!
編輯記錄
l90425 重新編輯於 2008-12-29 18:14:08, 註解 無‧
l90425 重新編輯於 2008-12-29 18:18:09, 註解 無‧
系統時間:2017-12-15 23:50:10
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!