【问题标题】:Reallocating memory via "new" in C++通过 C++ 中的“new”重新分配内存
【发布时间】:2010-04-01 02:54:14
【问题描述】:

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

如果我执行以下操作:

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

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

这是否会导致从前面的“new”语句中分配内存?例如,每个 new 语句是从操作系统接收另一块 HEAP 内存,还是只是重新分配?

假设我做一个最终的delete pointer[];,是否会将我曾经通过new分配给该指针的所有内存释放?

【问题讨论】:

  • 回收内存取决于平台/操作系统,不同平台之间可能不同。一旦内存为deleted 或freed,由平台负责,如果可能,何时重用。

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


【解决方案1】:

new 的每个调用必须与对delete 的相应调用相匹配。

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

【讨论】:

  • 并且每次调用 new[] 都必须匹配 delete []
  • 如果你真的想要指针,使用 std::tr1::share_ptr 来获得释放内存的处理。
  • @jpyllman:但 AFAIK shared_ptr<> 无法处理开箱即用的数组。您必须提供合适的删除器
【解决方案2】:

这是否会导致从前一个“new”语句中分配内存?

是的,这称为内存泄漏。

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

它是堆中的一块新内存。

假设我做了一个最终的删除指针[];这会释放我曾经通过 new 分配给该指针的所有内存吗?

如果您“删除 [] 指针;”,它将释放它指向的内存。只有上次“new char[]”调用的内存。

【讨论】:

    【解决方案3】:

    当您说“那个指针”时,重要的是要理解“那个指针”的值会随着每次分配而改变。一次分配后,可能是 0x100234,下一次分配后,是 0x104234。这意味着如果您重新分配指向新地址(新内存块)的指针而不释放(删除[])旧块,您将在进程期间泄漏内存。

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        它会让你的记忆悬而未决。在对同一个指针再次使用“new”运算符之前,您需要调用 delete [] 命令(除非您将该地址分配给另一个指针)。

        【讨论】:

          【解决方案6】:

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

          每个 new[] 语句都返回缓冲区中第一个元素的地址。 您将这个地址存储在哪里,或者即使您存储它也无关紧要。

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

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

          【讨论】:

            【解决方案7】:

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

            【讨论】:

              【解决方案8】:

              如前所述,新的ahs要匹配一个delete。但是如果你可以使用 stdlib 的 malloc/free,有一个 realloc 函数: cplusplus.com

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2014-07-11
                • 2013-02-02
                相关资源
                最近更新 更多