语言:C ++

平台:Windows Server 2003中

我有一个exe调用的DLL。

修改 (exe文件没有做任何事情,它会调用一些全局函数做内DLL相关DLL的一切。它并没有明确的的任何DLL类)

我分配()的对的类存储器A 在DLL中,它返回我的非本地堆指针即可。

我试图在DLL中的其它类(它们是在DLL),“新的”回报他们的有效堆指针,其唯一的一类这是没有被正确分配。

我在窗口和由该函数调用验证堆:

修改

 ClassA* pA = new ClassA(); 

 _CrtIsValidHeapPointer ( (const void *) pA )

我很认真地困惑,为什么这个只的的-ing的 A级并没有其他的类会发生什么?

(适用所有本机代码)

<强> FINAL编辑:结果 它原来是一个糟糕的构建。不能让它在新的一个...浪费了5天此重现:“(

有帮助吗?

解决方案

从DLL和呼叫仅导出的函数,并通过V-表仅导出全局函数。你的问题只是众多造成尝试导出整个类之一。 DLL是不一样的。所以库。

编辑:由于现在的问题揭示了类不导出,但所有这一切都是观察到的单个DLL的内部,要建议其他可能的原因

时从new返回相同的指针正在测试中,或可以将它是指向基底子对象?做了分配使用newnew []?任一这些可能导致指针点到一个堆块的代替开始的中间。

其他提示

如果Class A覆盖operator new然后该类的存储器可以在C运行时的DLL的副本分配。这将导致_CrtIsValidHeapPointer来回报false - 因为 C运行时库您的版本使用的是不同的堆一个比在DLL

_CrtIsValidHeapPointer返回的值通常是不可靠的呢(当然,即使它可能会返回TRUE这并不一定意味着你可以的使用的指针)。你为什么这样做呢?

也许类新定义它自己的运营商,从一些神秘的位置开始存储?

e.g。类的作者可能已经写:

class MyClass {
   public:
     void * operator new (size_t amt);
     void operator delete(void *);
};

然后他们的运营商新的节拍您的运营商新的。

要么或该DLL是建立与/ MTD而可执行的用途/ MD。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top