如果缓冲区包含'0'字符,你可以检查堆上分配的大小内存吗?
char *c = new char[6]; //random size memory
memset(c, 0, 6);
答案 0 :(得分:3)
没有可靠的方法 - 你必须自己存储这些信息。
operator new[]()
函数可以以任何方式实现(并由您替换),因此除非您知道详细的具体实现,否则您无法知道大小。
在Visual C ++中,内置类型的默认实现只是将调用转发到malloc()
- 然后你可以尝试_msize()
,但它又是不可移植的,甚至可能不可靠。
答案 1 :(得分:2)
不,一般来说 1 你不能。您必须单独存储此信息。
如果您需要将该内存用作字符串或数组,我的建议是使用std::string
或std::vector
,它们可以自行完成所有这些记录。
<小时/> 1.即“就标准而言”
<小时/> 我看到你的问题是MSVC ++特定的;在这种情况下,一些堆调试助手are provided,但它们仅在项目以调试模式编译时才有效;我认为还有一些其他特定于编译器的函数来获取分配的大小,但如果使用自定义分配器则不起作用。
另一方面,像LocalAlloc
这样的API让你知道分配的内存块有多大(参见例如LocalSize
)。
但同样,我认为自己跟踪这些信息是一种更清洁的设计。
答案 2 :(得分:1)
没有。您需要将分配的内存量存储为单独的变量,并且只要您想对分配的结构执行某些操作,就需要随身携带它。这很麻烦,但可能很快。作为安全和舒适的替代品,使用std :: vector,boost :: array等