C# 为什么我的互操作代码抛出一个;堆栈cookie检测代码检测到基于堆栈的缓冲区溢出;例外?

C# 为什么我的互操作代码抛出一个;堆栈cookie检测代码检测到基于堆栈的缓冲区溢出;例外?,c#,c++,arrays,memory,limit,C#,C++,Arrays,Memory,Limit,因为我在内存读取等方面有点混乱,所以我用1000000个元素创建了byte[]数组,这样每个数组可以存储1MB的数据。我最终使用了这些1000000个元素数组中的大约750isch,当我检索数据时,我一个接一个地添加了这些数组,例如:获取MB内存,添加到列表,获取下一个MB。但它只是失败了,出现了一个溢出异常。那么,对于一个列表可以包含多少元素,是否有一个实际的限制,或者列表是否有一个“数据”限制?如果我没有超过这个限制,是什么导致了这个问题的发生 编辑:异常的屏幕截图 Edt2:我从C++

因为我在内存读取等方面有点混乱,所以我用1000000个元素创建了byte[]数组,这样每个数组可以存储1MB的数据。我最终使用了这些1000000个元素数组中的大约750isch,当我检索数据时,我一个接一个地添加了这些数组,例如:获取MB内存,添加到列表,获取下一个MB。但它只是失败了,出现了一个溢出异常。那么,对于一个列表可以包含多少元素,是否有一个实际的限制,或者列表是否有一个“数据”限制?如果我没有超过这个限制,是什么导致了这个问题的发生

编辑:异常的屏幕截图

Edt2:我从C++ DLL调用函数,读取下一个1MB并返回指向该数组

的指针 编辑3: C部分

包装纸

[DllImport("Dumper.dll")]
public static extern IntPtr GetNextMB();

C++部分 .cpp文件 .h文件

extern "C"
{
    __declspec(dllexport) DWORD __cdecl GetPID();
    __declspec(dllexport)  byte * __cdecl GetNextMB();
}
EDIT4:感谢您提供的所有见解和快速响应,男孩(如果他们在那里,还有女孩:S)


EDIT5:现在一切都已修复,程序正在运行

是的,但它是由您拥有的内存量定义的

如果您有足够的内存来添加会破坏类的值

这可能是一个错误的原因

如果你的内存不足,我希望有一个


您所获得的错误不是C++异常,而是C++异常,


<>你在C++代码中做了一些错误,或者你从C语言调用了错误的代码。请注意,这与我认为我已经回答的原始问题非常不同。

好的,代码很明显

在C++侧分配一个本地数组,并返回指向该数组的指针。如果您习惯于使用本机代码,那么这应该已经敲响了警钟——您不会返回指向本地代码的指针

然后使用<代码> MARHALL杀死它。复制< /代码>不正确-而不是从C++代码中获取数据(可能是畸形的,因为你返回了指向本地的指针),你将C字节数组复制到C++函数中的指针-重写C++堆栈。轰


<>但是,我不明白为什么你会使用C++库来调用<代码> RealPosialStime< /Cord>——为什么不直接调用它呢?我正是在我的小工具中这样做的。

你能发布一些代码和确切的异常类型吗?
列表
对象不会是这里的问题-它将是为所有单独的字节数组分配的内存。是的,如果你的内存用完了,你最终会得到一个异常……你到底在做什么?这不是您应该在托管代码中看到的那种异常。你在使用不安全的代码吗?或者P/Invokes?该异常不是由于内存不足问题,而是由于堆栈损坏问题。您正在调用非托管代码吗?不,托管端没有限制。你可能正在做一些非常不安全的事情,最终你覆盖了一些你不应该做的事情。也许你在调用C++函数或者传递不固定的指针时使用错误的调用约定,或者你希望调用正在传递一个引用到你的代码>字节[]/Cord>(不是这样——它复制了数组)——调用本机代码是不容易的。注意添加代码和C和C++中分配函数的定义,这不提供解释,750×1Mb= 750MB,每个数组有1000000个元素750MB < 16GB max RAM i(是的,是64位应用)1000000 返回的结果甚至没有那么令人震惊。。。如果您想震惊,请查看正在使用
地址执行的操作!因为我正在练习编写能够interop@HyunMi这是一个很好的实践——但首先要确保您了解本机代码的复杂性。有很多。在现实世界中,调用方会分配缓冲区,这更灵活、更安全(别忘了,没有自动内存管理来清理非托管代码中的混乱;这就是为什么称之为非托管)。您可以在我提供的代码中看到这一点的C端-在P/Invoke上只需要一个简单的
[Out]字节[]
,封送拆收器将处理其余部分。
extern byte * __cdecl GetNextMB()
{
    if (!VarsSet) SetVars();
    byte buffer[1000000];
    ReadProcessMemory(pHandle, (void*)Address, &buffer, sizeof(buffer), 0);
    Address = Address + sizeof(buffer);
    return buffer;
}
extern "C"
{
    __declspec(dllexport) DWORD __cdecl GetPID();
    __declspec(dllexport)  byte * __cdecl GetNextMB();
}