堆上分配的内存大小

时间:2011-02-14 11:05:48

标签: c++ visual-c++ heap

如果缓冲区包含'0'字符,你可以检查堆上分配的大小内存吗?

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

3 个答案:

答案 0 :(得分:3)

没有可靠的方法 - 你必须自己存储这些信息。

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

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

答案 1 :(得分:2)

不,一般来说 1 你不能。您必须单独存储此信息。

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

<小时/> 1.即“就标准而言”

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

另一方面,像LocalAlloc这样的API让你知道分配的内存块有多大(参见例如LocalSize)。

但同样,我认为自己跟踪这些信息是一种更清洁的设计。

答案 2 :(得分:1)

没有。您需要将分配的内存量存储为单独的变量,并且只要您想对分配的结构执行某些操作,就需要随身携带它。这很麻烦,但可能很快。作为安全和舒适的替代品,使用std :: vector,boost :: array等