运营商的“新”只为一个类返回一个非本地堆指针?
-
26-09-2019 - |
题
语言: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
返回相同的指针正在测试中,或可以将它是指向基底子对象?做了分配使用new
或new []
?任一这些可能导致指针点到一个堆块的代替开始的中间。
其他提示
如果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。