我试图了解在使用new关键字动态分配内存时指定大小的确切用途,以及释放该内存时它将扮演什么角色。
mapPropsToValues
我知道在第一个示例中,我正在访问错误的内存部分,而且很显然,通过调用delete,它不会释放所有分配的内存,但是我试图理解在此情况下还有什么地方可能出错这种情况,同时调用删除。
据我所知,为了跟踪分配的内存并在需要时适当释放它,需要规格说明。请提供有关此部分的一些信息。
答案 0 :(得分:3)
该代码的第一个版本为一个字符分配空间,这是完全有效的,您可以使用new
分配单个内容,或者使用new[]
分配一个内容数组。麻烦的是,然后您去遍历您不拥有的所有内存,这是未定义的行为。
调用delete
时没有任何问题,您正在删除有效的,先前分配的指针。可能出问题的是,如果您正在突变自己不拥有的内存。
在第二种情况下,您分配了3个字符,并且操作有效。
请注意,在C ++中,您应该将std::string
用于字符串数据,或者将std::vector
用于可变长度,或者将std::array
用于固定长度分配。
答案 1 :(得分:2)
指定大小分配一个数组。如果您的类型是int[3]
,它将为3个int
分配空间。如果类型仅为int
,它将只为1个int
分配足够的内存。
据我所知,为了跟踪分配的内存并在需要时适当释放它,需要规格说明。请提供有关此部分的一些信息。
您需要跟踪分配的内存量,以免超出限制。至于释放内存,delete
和delete[]
就可以了。如果您在程序中进行跟踪,它们将无偿地释放正确数量的内存。
答案 2 :(得分:1)
“在这种情况下还有什么可能出问题”
好吧,这是未定义的行为。这意味着所有的保证都没有了-永远。硬盘格式化了吗?一切都可能出错,所以也是。
只需使用std::string
。它可以保存硬盘。