1

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

这是我的问题:我编写了一个导出从 CSocket 派生的类的 DLL,除了隐式加载 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,结果相同。

提前致谢。

问候,

尼尔

4

1 回答 1

1

我认为正在发生的事情DECLARE_DYNCREATE是针对一个在运行时计算大小的对象。

当你说:

CMyClass *m_lpMyObj = new MyClass;

它确实可以为实例分配所需的内存,但是当你说:

CMyClass m_myObj;

它在编译时没有真正的大小,只有“存根”的大小,所以当它尝试使用对象时,它正在写入超出分配空间的末尾。

于 2012-08-05T18:21:41.303 回答