【发布时间】:2015-08-05 12:10:30
【问题描述】:
因为我在内存读取等方面有点搞砸了。我制作了包含 1000000 个元素的 byte[] 数组,这样它们每个可以存储 1MB 的数据。我最终使用了这 1000000 个元素数组中的大约 750-isch,当我检索数据时,我一一添加,例如:获取 MB 内存,添加到列表,获取下一个 MB。但它只是因溢出异常而失败。那么 List 可以包含多少元素是否存在实际限制,或者 List 是否存在“数据”限制?如果我没有超过这个限制,是什么导致了这个问题的发生?
EDIT2:我正在从一个 c++ dll 调用一个函数,该函数读取下一个 1MB 并返回一个指向该数组的指针
编辑3: C#部分
private static void FetchNextBuffer()
{
IntPtr pRaw = Wrapper.GetNextMB();
byte[] buff = new byte[1000000];
Marshal.Copy(buff, 0, pRaw, 1000000);
RawDataFetch.Add(buff);
}
包装器
[DllImport("Dumper.dll")]
public static extern IntPtr GetNextMB();
c++部分 .cpp 文件
extern byte * __cdecl GetNextMB()
{
if (!VarsSet) SetVars();
byte buffer[1000000];
ReadProcessMemory(pHandle, (void*)Address, &buffer, sizeof(buffer), 0);
Address = Address + sizeof(buffer);
return buffer;
}
.h 文件
extern "C"
{
__declspec(dllexport) DWORD __cdecl GetPID();
__declspec(dllexport) byte * __cdecl GetNextMB();
}
EDIT4:感谢所有的见解和快速响应的家伙(和女孩,如果他们在那里:S)
EDIT5:现在全部修复,程序正在滚动
【问题讨论】:
-
你能发布一些代码和确切的异常类型吗?
-
List<byte[]>对象不会是这里的问题——它将是您为所有单独的字节数组分配的内存。是的,如果你的内存用完了,你最终会得到一个异常...... -
你到底在做什么?这不是您应该在托管代码中看到的那种异常。你在使用不安全的代码吗?还是 P/Invokes?
-
该异常不是由于内存不足问题,而是由于堆栈损坏问题。你在调用非托管代码吗?
-
不,托管端没有限制。你可能正在做一些非常不安全的事情,最终你会覆盖你不应该做的事情。也许您在调用 C++ 函数时使用了错误的调用约定,或者您正在传递未修复的指针,或者您期望调用正在传递对您的
byte[]的引用(它不是 - 它复制了数组结束) - 调用本机代码绝非易事。是否在 C# 和 C++ 中添加代码和分配函数的定义?
标签: c# c++ arrays memory limit