在C ++中通过“new”重新分配内存

时间:2010-04-01 02:54:15

标签: c++ memory-management new-operator

关于C ++内存管理的快速问题

如果我执行以下操作:

pointer = new char [strlen(someinput_input)+1];

然后再次执行,可能会从strlen(someinput_input)返回不同的结果。

这是否会导致从先前的“new”语句中分配内存?就像在,每个new语句是从OS接收另一块HEAP内存,还是只是重新分配?

假设我做了最后的delete pointer[];会将我通过new分配的所有内存释放到该指针吗?

8 个答案:

答案 0 :(得分:9)

new 的每次通话都必须与对delete的相应通话匹配。

顺便说一句,您应该考虑使用std::string甚至std::vector<char>(取决于具体情况),而不是尝试自己分配char数组。那你就不用担心了。

答案 1 :(得分:7)

当你说“那个指针”时,重要的是要理解“指针”的值会随着每次分配而改变。在一次分配之后,也许它是0x100234,并且在下一次分配之后,它是0x104234。这意味着如果你重新指定一个新地址(一个新的内存块)指针而不释放(删除[])旧块,你将在整个过程中泄漏内存。

答案 2 :(得分:6)

  

这会导致内存从之前的“新”语句中分配出来吗?

是的,这称为内存泄漏。

  

IE,每个新语句是从OS接收另一块HEAP内存,还是只是重新分配?

它是堆中的新内存块。

  

假设我做了最后的删除指针[];是否会将我通过new分配的任何和所有内存释放给该指针?

如果你“删除[]指针;”,它将释放它指向的内存。只有最后一次“新char []”调用的内存。

答案 3 :(得分:2)

它会让你的记忆悬空。在同一指针上再次使用'new'操作符之前,您需要调用delete []命令(除非您将该地址分配给另一个指针)。

答案 4 :(得分:2)

指针只是一个保存内存地址的变量。它不会进行任何隐式引用计数。

每个new []语句返回缓冲区中第一个元素的地址。 存储此地址的地方,或者即使存储它也无关紧要。

只有在调用delete []时才会释放内存。

在C ++中没有自动引用计数/自动删除。当你进行另一次分配时,它不会释放旧分配。

答案 5 :(得分:2)

简而言之。每次调用new时,都会从堆中分配新内存。 c ++中没有任何魔法可以记住你指定​​的指针。

答案 6 :(得分:2)

每个new都是另一个分配。如果你将结果重新分配给中间没有delete的同一指针变量,那么内存就会丢失,即你有一个 内存泄漏

答案 7 :(得分:1)

如前所述,新的啊与删除匹配。但是如果你可以使用stdlib的malloc / free,那么有一个realloc函数: cplusplus.com