堆上分配的内存大小

Posted

技术标签:

【中文标题】堆上分配的内存大小【英文标题】:Size of memory allocated on heap 【发布时间】:2011-02-14 11:05:47 【问题描述】:

如果缓冲区包含“0”字符,您能否检查?

char *c = new char[6]; //random size memory
memset(c, 0, 6);

【问题讨论】:

【参考方案1】:

没有可靠的方法来做到这一点 - 您必须自己存储这些信息。

operator new[]() 函数可以以任何方式实现(并由您替换),因此除非您详细了解确切的实现,否则您无法知道大小。

在 Visual C++ 中,内置类型的默认实现只是将调用转发到 malloc() - 然后您可以尝试 _msize(),但同样它是不可移植的,甚至可能不可靠。

【讨论】:

【参考方案2】:

不,一般1你不能。您必须单独存储这些信息。

如果您需要将该内存用作字符串或数组,我的建议是使用std::stringstd::vector,它们自己完成所有这些簿记。


1.即“就标准而言”


我看到您的问题是特定于 MSVC++ 的;在这种情况下,一些堆调试助手are provided,但它们仅在项目以调试模式编译时工作;我认为还有一些其他特定于编译器的函数来获取分配的大小,但如果使用自定义分配器,它就不起作用。

另一方面,LocalAlloc 之类的 API 让您知道分配的内存块有多大(参见例如 LocalSize)。

不过,我认为自己跟踪这些信息是一种更简洁的设计。

【讨论】:

【参考方案3】:

没有。您需要将分配的内存量存储为单独的变量,并且每当您想对分配的结构做某事时都需要随身携带。这很麻烦,但可能很快。作为安全舒适的替代品,请使用 std::vector、boost::array 等。

【讨论】:

以上是关于堆上分配的内存大小的主要内容,如果未能解决你的问题,请参考以下文章

Unix系统编程()在堆上分配内存

为什么我们不能在堆栈上分配动态内存?

C之静态内存和动态内存

内存管理相关API列表

内存池设计与实现总结

C之堆栈