【问题标题】:How to expand previously initialized memory size?如何扩展先前初始化的内存大小?
【发布时间】:2020-07-18 12:58:36
【问题描述】:
int main()
{
    int *memory = new int[5];

    cout << "Memory starts at: " << &memory[0]; // 0x56225460beb0

    memory = new int[10];

    cout << "\nMemory starts at: "<< &memory[0]; // 0x56225460c2e0
                                                //   different
    cout << '\n';
    return 0;
}

new初始化时,有没有办法在C++中扩展之前初始化的内存。上面的代码最终为memory 创建了一个新的内存位置。这是否也意味着之前分配的内存最终占用了我的内存空间,因为我没有delete

【问题讨论】:

  • 使用std::vector&lt;int&gt;
  • @PaulMcKenzie 它也会重新分配。所以不要扩展之前的内存。
  • OP 的代码中没有进行重新分配,只有内存泄漏。
  • @PrateekParasha -- 你真正想解决什么问题?这变成了XY Problem
  • 您无法展开std::array

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


【解决方案1】:

您可以使用std::vector,它在大多数情况下会过度分配,因此在某种程度上不会重新分配。

您也可以使用mallocrealloc,它们的作用类似于vector,但我不推荐它,因为您必须手动调用operator new 和析构函数。

你也可以设计你自己的分配器来做任何你想做的事情,但它需要更多的工作,所以我还是坚持使用向量。

【讨论】:

  • uninitialized_move 可以帮助 realloc 但与矢量相比它仍然很糟糕。
【解决方案2】:

您可以使用 C 语言提供的 realloc。

memory = (int *) realloc(memory, 10);

它将从同一个地址重新分配。

【讨论】:

  • "它将从同一个地址重新分配。"它可能会也可能不会。对于非 POD 结构,它是不安全的,因为它不调用构造函数或析构函数。
  • 不保证realloc返回相同的地址。
  • 您不能使用realloc 分配给new 的内存。
  • malloc, calloc & realloc 不调用构造函数或析构函数,因此它们通常不适合与 C++ 对象一起使用。
  • 如果realloc() 在您的示例中返回nullptr,则说明存在内存泄漏。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-09-23
  • 1970-01-01
  • 2012-10-14
  • 1970-01-01
  • 2014-01-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多