我在C#中分配一块内存来从非托管数据缓冲区中检索信息:
handle = Marshal.AllocHGlobal(33455);
检索到的信息的最大大小为33,455字节,但信息的大小可能小于某些情况下的大小。
如何确定分配的块中实际使用的字节数,而不是实际分配的字节数?
答案 0 :(得分:4)
系统如何知道使用哪些数据与随机数据?它对数据结构一无所知。它只知道你分配了多少。您不是在句柄中存储字节。句柄只是指为你留出的一块内存。
您可以将数据初始化为sentinel值(例如Windows将在调试模式下执行的0xcdcdcdcd)然后您可以计算它。或者,如果数据是字符串,则可以调用strlen()(或其中一个安全字符串函数)。或者,您可以编写一些包装函数来包装用于写入内存的API,并跟踪您使用的数据量。
答案 1 :(得分:1)
根据MSDN上的文档
http://msdn.microsoft.com/en-us/library/s69bkh17.aspx
您将获得分配的内存,或者如果请求无法完成,您将获得内存不足的异常。
因此,您的问题的答案是,您将: 1)通过'handle'分配和引用33455字节的内存,或者...... 2)将引发内存不足异常,并且您将分配零字节内存并通过'handle'引用。
在这个非常低的水平上,这就是你所知道的。
您可以在块的开头存储一个计数,以指示您已使用了多少,或者使用已建议的标记值。