关于C ++内存管理的快速问题
如果我执行以下操作:
pointer = new char [strlen(someinput_input)+1];
然后再次执行,可能会从strlen(someinput_input)
返回不同的结果。
这是否会导致从先前的“new
”语句中分配内存?就像在,每个new
语句是从OS接收另一块HEAP内存,还是只是重新分配?
假设我做了最后的delete pointer[];
会将我通过new
分配的所有内存释放到该指针吗?
答案 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