在动态分配内存时使用指定大小

时间:2019-05-07 22:32:37

标签: c++ memory-management char delete-operator

我试图了解在使用new关键字动态分配内存时指定大小的确切用途,以及释放该内存时它将扮演什么角色。

mapPropsToValues

我知道在第一个示例中,我正在访问错误的内存部分,而且很显然,通过调用delete,它不会释放所有分配的内存,但是我试图理解在此情况下还有什么地方可能出错这种情况,同时调用删除。

据我所知,为了跟踪分配的内存并在需要时适当释放它,需要规格说明。请提供有关此部分的一些信息。

3 个答案:

答案 0 :(得分:3)

该代码的第一个版本为一个字符分配空间,这是完全有效的,您可以使用new分配单个内容,或者使用new[]分配一个内容数组。麻烦的是,然后您去遍历您不拥有的所有内存,这是未定义的行为。

调用delete时没有任何问题,您正在删除有效的,先前分配的指针。可能出问题的是,如果您正在突变自己不拥有的内存。

在第二种情况下,您分配了3个字符,并且操作有效。

请注意,在C ++中,您应该将std::string用于字符串数据,或者将std::vector用于可变长度,或者将std::array用于固定长度分配。

答案 1 :(得分:2)

指定大小分配一个数组。如果您的类型是int[3],它将为3个int分配空间。如果类型仅为int,它将只为1个int分配足够的内存。

  

据我所知,为了跟踪分配的内存并在需要时适当释放它,需要规格说明。请提供有关此部分的一些信息。

您需要跟踪分配的内存量,以免超出限制。至于释放内存,deletedelete[]就可以了。如果您在程序中进行跟踪,它们将无偿地释放正确数量的内存。

答案 2 :(得分:1)

“在这种情况下还有什么可能出问题”

好吧,这是未定义的行为。这意味着所有的保证都没有了-永远。硬盘格式化了吗?一切都可能出错,所以也是。

只需使用std::string。它可以保存硬盘。