堆上分配的内存大小
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::string
或std::vector
,它们自己完成所有这些簿记。
1.即“就标准而言”
我看到您的问题是特定于 MSVC++ 的;在这种情况下,一些堆调试助手are provided,但它们仅在项目以调试模式编译时工作;我认为还有一些其他特定于编译器的函数来获取分配的大小,但如果使用自定义分配器,它就不起作用。
另一方面,LocalAlloc
之类的 API 让您知道分配的内存块有多大(参见例如 LocalSize
)。
不过,我认为自己跟踪这些信息是一种更简洁的设计。
【讨论】:
【参考方案3】:没有。您需要将分配的内存量存储为单独的变量,并且每当您想对分配的结构做某事时都需要随身携带。这很麻烦,但可能很快。作为安全舒适的替代品,请使用 std::vector、boost::array 等。
【讨论】:
以上是关于堆上分配的内存大小的主要内容,如果未能解决你的问题,请参考以下文章