【问题标题】:How to deallocate a structure of dynamic size [duplicate]如何解除分配动态大小的结构[重复]
【发布时间】:2012-11-17 00:14:11
【问题描述】:

可能重复:
delete[] an array of objects

内存分配如下:

struct foo {
  int size;
  int * arr;
};

(*structA).arr = new int[(*structA).size];

如何解除分配?

【问题讨论】:

  • 你只需调用“delete (*structA).arr;”你是金子吗?无需指定需要释放多少内存。
  • 一般规则:每个new 一个delete,每个new[] 一个delete[]

标签: c++ arrays data-structures memory-management


【解决方案1】:

您使用new[] 分配的任何内容都必须使用delete[] 删除:

structA->arr = new int[structA->size];
...
delete[] structA->arr;

在这个特定的例子中,最好使用std::vector。让它为您处理内存分配和释放。您可以使用它的size() 方法来确定它持有多少物品:

struct foo {
  std::vector<int> arr;
};

structA->arr.resize(some value here);
...
int size = structA->arr.size();

【讨论】:

  • 这看起来不错,谢谢 - 但最初,我使用向量编写了整个程序,并且通过一些自动基准测试太慢了,所以我使用数组重写了它。
  • @Grant :我保证vector&lt;&gt; 不是您的瓶颈的根源。
  • Vectors 和 new[arraySize] 一样快,所以它们不会减速。 (嗯,稍微慢一点,但完全可以忽略不计)
  • vector POD 类型的分配与原始数组一样快。我猜vector 可能是按值传递的,所以很多时间都浪费在制作复制构造的临时文件上。
【解决方案2】:

调用时分配的内存会被删除

delete[] (*structA).arr;

至于你的结构,这取决于你是在堆还是栈上分配结构。

【讨论】:

  • 还有一个问题:我将如何处理二维结构数组?定义如下: int (*foo)[2] = new int[size][2];
  • 完全一样。 “删除[] foo;”你很好。您可以使用调试器对此进行测试,并检查应用程序的当前内存使用情况。
猜你喜欢
  • 1970-01-01
  • 2023-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多