创建DLL导出对象时出现Stackoverflow错误

时间:2012-08-05 18:01:25

标签: c++ dll dllimport dllexport

首先,我为任何错误道歉,英语不是我的母语。

这是我的问题:我编写了一个DLL,它导出了一个派生自CSocket的类,除了隐式加载DLL的客户端必须按如下方式实例化对象外,一切正常。

// Inside client constructor (client class scope object pointer)
CMyClass *m_lpMyObj = new MyClass;

但如果对象实例化如下:

// Inside the client class header file (client class scope object)
CMyClass m_myObj;

当我运行客户端时,我收到错误:

Unhandled exception at 0x775015de in MyApp.exe: 0xC00000FD: Stack overflow.

如果在我编写的客户端方法中存在同样的问题:

// Inside a client method (local object)
CMyClass myobj;

唯一的区别是当我调用该方法时发生错误(当然)。

这里有一些关于班级的细节:

// _AFXEXT defined for DLL project

#ifdef __cplusplus
extern "C" {
#endif

class CMyClass : public CSocket
{
  DECLARE_DYNCREATE(CModbusConnector)

public:
  AFX_EXT_CLASS CMyClass();  // Only some methods are exported
  AFX_EXT_CLASS virtual ~CMyClass();

  ....
};

#ifdef __cplusplus
}
#endif

DLL是CWinApp派生的对象(常规DLL),我将DLL编译为扩展DLL,结果相同。

提前致谢。

此致

尼尔

1 个答案:

答案 0 :(得分:1)

我认为正在发生的事情是DECLARE_DYNCREATE适用于在运行时计算大小的对象。

当你说:

CMyClass *m_lpMyObj = new MyClass;
实际上,它可以为实例分配所需的内存,但是当你说:

CMyClass m_myObj;

它在编译时没有真正的大小,只有'stub'的大小,所以当它尝试使用它时,它的写入超出了分配空间的末尾。