DLL匯出類,在EXE中呼叫delete時非法操作

2021-04-12 17:37:10 字數 926 閱讀 5955

現象:

在exe中使用由動態庫匯出的類,在delete時非法操作。有其他模組(dll或exe)呼叫都非法。

程式如下:

#include "stdafx.h"

int main(int argc, char* argv)

dll庫

#define dllexport __declspec(dllexport)

class dllexport hptest;

hptest::hptest()

hptest::~hptest()

執行出錯誤

原因:由於類的析構被定義為虛函式,在進行類的析構後,在動態庫內執行了delete操作。可參照此文章:

http://support.microsoft.com/kb/122675/zh-cn。析構函式如果為非虛的,則不會有此現象

解決方法:

1.在類內過載new和delete操作符。

class dllexport hptest;

void* hptest:: operator new(size_t size)

void hptest:: operator delete(void *p)

2.使用dllimport

a 動態庫中實現類,指定 _declspec(dllexport)。

b. exe使用類時指定 _declspec(dllimport)。

c. 使用虛擬析構

#ifdef _dll

#define dllexp __declspec(dllexport)

#else

#define dllexp __declspec(dllimport)

#endif

class dllexp hptest

;dll的工程內定義巨集_dll.

3.其他方法,參看參照文章即可。

在EXE和DLL中,FindResource的區別

在exe和dll中,findresource的區別 以下的 在exe中,執行無誤。可是在dll中findresource返回的值就為0了,我用 getlasterror 得出的值是1813,也就是取不到資源,這是為什麼?bool extractfile char szzlibfile,dword d...

在lua中呼叫DLL

整整的花了乙個下午的時候,才在lua中呼叫了動態鏈結庫。比起其他指令碼語言,lua的呼叫方式算是比較繁瑣的,但是lua的程式設計思想非常的統一,即lua和c之間的傳值都是通過棧進行的,目前為止我還沒有深入的去了解這個 棧 但是這並不妨礙去使用 棧 當我們在乙個空的工程中寫下幾個c c 的函式,然後把...

在C 中呼叫EXE檔案

1.如果exe檔案的返回值是int型別,標識操作執行的結果是否成功,例如 class program 則在呼叫exe檔案時,可以用如下方法 process myprocess new process string filename c test.exe string para 你好 北京歡迎你!pr...