本机 dll 中的动态内存分配
Dynamic memory allocation in native dll
我有一个用C++编写的本机(非托管).dll,将从托管进程(C#程序)调用。调试 dll 时,我遇到的问题是,当我使用new
关键字在 dll 中创建对象时,我会出现系统访问冲突异常。这仅在从托管进程调用 dll 时显示,而不是在我从另一个本机程序调用它时显示。
代码类似于以下内容:
// Native.dll file
MyClass myInstance; // global variable (and does need to be so)
__declspec(dllexport) uint8_t _stdcall NativeFunction(){
myInstance = new MyClass(); // <-- this causes Access Violation Exception
}
和 C# 代码:
using System.Runtime.Interopservices;
// Loading the dll
[DllImport("Native.dll",CallingConvention = CallingConvention.StdCall)]
private extern static byte NativeFunction();
class TestClass{
byte returnVal = NativeFunction(); //<-- exception in managed context
}
我知道这与本机进程试图在允许的内存空间之外分配内存有关。仅当内存分配了new
(至少在这个项目中)时,它才会发生,不幸的是我确实需要使用。我的问题是:有谁知道为什么这会导致异常以及如何避免它?
>new MyClass
很可能会调用全局运算符::operator new
,除非您提供了MyClass::operator new
。如果你自己没有提供::operator new
,你应该从编译器(可能是Visual Studio)获取::operator new
。
这个::operator new
实现可能会转发给HeapAlloc
。你猜怎么着?这与.Net将调用的Win32函数相同。这里没有太多的魔法;这就是 Windows 将内存页分配给虚拟地址空间的方式。当您使用这些页面时,Windows将分配RAM。
现在这里的事情是,你不需要为此做任何特别的事情。事实上,做任何特别的事情都是你打破operator new
的方式。既然你打破了它,你将不得不弄清楚这一点。这里没有太多的魔法代码。使用调试版本,因此您将拥有清晰的堆栈转储(无内联)。你能回溯到HeapAlloc
吗?
还要检查访问冲突异常的内容。错误代码将C0000005。但它是什么类型的例外?读还是写?在什么类型的地址上?代码还是数据?
相关文章:
- Win32编译器选项和内存分配
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 当需要超过16GB的连续内存时,内存分配失败
- 尝试摆脱任何堆内存分配
- 以下代码执行哪种内存分配(动态或静态)?
- 开放 CV 中的动态内存分配,用于视频处理
- 为什么类和 main() 函数中也有动态内存分配
- 使用 NTAllocateVirtualMemory 和 GetProcAddress 的内存分配问题不起作用
- C++:矢量分配器行为、内存分配和智能指针
- 介于 [固定数组] 和 [带内存分配的指针] 之间的性能
- Linux C++ 中的页面对齐内存分配
- 整数内存分配/释放
- 将内存分配返回值强制转换为 TYPE 数组
- C++程序什么都不做,但瓦尔格林德显示内存分配
- 给定特定内存地址的数组的动态内存分配
- 如何完成内存分配
- 我刚刚了解了C++中的动态内存分配
- 在先前调用 string::find 后添加内存分配和内存集会导致它返回 npos.为什么?
- 对于堆上的页面对齐内存分配是否有任何优化或不同的 API?
- 无法删除布尔动态内存分配