使用C++中的“new”重新分配内存

12

关于C++中的内存管理,我有一个快速的问题。

如果我执行以下操作:

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

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

这样做会导致之前"new"语句分配的内存仍然留在那里吗?也就是说,每个new语句是从操作系统接收到另一个堆内存块,还是只是重新分配内存?

假设我最后使用delete pointer[];,这样是否可以释放我曾经通过new分配给该指针的所有内存?


内存回收取决于平台/操作系统,不同平台可能会有所不同。一旦内存被“delete”或“free”,平台就负责它,并在可能的情况下决定何时重用它。 - Thomas Matthews
8个回答

11

这会导致前一个“new”语句留下分配的内存吗?

是的,这被称为内存泄漏。

也就是说,每个新的语句都从操作系统获得另一个HEAP内存块,还是只是重新分配?

它是从堆中获得一个新的内存块。

假设我最后使用delete pointer[];,那么它会释放我通过 new 分配给该指针的所有内存吗?

如果你使用"delete [] pointer;",它将释放它所指向的内存。仅限于最后一次 "new char[]" 调用分配的内存。


10

new 的每一次调用 必须 与相应的 delete 调用匹配。

另外,你可能应该考虑使用std::string 或甚至是std::vector<char>(根据具体情况而定),而不是尝试自己分配 char 数组。这样你就永远不需要担心了。


8
每次使用 new[] 后都必须使用对应的 delete[] 来释放内存。 - Billy ONeal
如果你真的需要指针,使用std::tr1::share_ptr来获取释放内存的处理。 - jpyllman
但据我所知,shared_ptr<>不能直接处理数组。您需要提供一个匹配的删除器。 - sbi

8
当你说“那个指针”时,重要的是要理解“那个指针”的值会随着每次分配而改变。在一次分配后,可能是0x100234,而在下一次分配后,它可能是0x104234。这意味着如果你重新将指针赋值给一个新地址(一块新的内存块),而没有释放(delete[])旧的内存块,你将会在整个进程中泄漏内存。

3
简而言之,不行。每次调用 new 时,你都会在堆上分配新的内存。C++ 中没有任何魔法可以记住你所分配指针的位置。

2

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


2

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

每个new[]语句返回缓冲区中第一个元素的地址。 你存储这个地址的位置,或者是否存储它都没有关系。

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

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


2
每一个new都会导致另一次内存分配。如果在中间没有使用delete将结果重新分配给相同的指针变量,那么就会出现内存泄漏,也就是说,你会遇到内存泄漏问题。

1

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接