静态数组的自由动态数组

Free dynamic array of static arrays?

本文关键字:数组 动态 自由 静态      更新时间:2023-10-16

我有类似于这个的代码

EDIT这个代码应该在接口上,所以只允许POD。没有矢量,没有容器。

int (*neco)[2];
int ahoj = 2;
neco = new int[ahoj+2][2];
int iter = 1;
for (size_t i = 0; i < 4; i++)
{
for (size_t j = 0; j < 2; j++)
{
neco[i][j] =iter;
iter++;
}
}
for (size_t i = 0; i < ahoj + 2; i++)
{
delete[] neco[i];
}

这不起作用。删除操作会删除未分配的内存。甚至连都没有

删除[]neco;

或任何其他删除。他们每个人都会在分配的块之前删除内存。

谷歌搜索和咨询办公室同事都没有结果

如何分配"点"(两个坐标(的动态数组,然后释放它们?

我能够通过使用不同的结构来解决问题。

但我显然能够分配内存。写入分配的内存…

如何正确释放此内存?(只是一个专业问题。(

指向动态分配内存的普通指针会给您带来麻烦。

使用std::unique_ptr:

#include <memory>
// ...
std::unique_ptr<int[][2]> neco(new int[ahoj+2][2]);

并用delete[]移除那个循环。

或者,使用std::vector<int[2]> neco(ahoj+2)——它为您进行内存管理,并且可以调整大小。

一般规则是每个new表达式都必须由一个相应的delete表达式匹配。

您的new表达式是语句的右侧

neco = new int[ahoj+2][2];

因此在语句中给出了相应的CCD_ 7表达式

delete [] neco;

如果这不起作用(这就是你所说的(,那就意味着问题出在其他一些表现出未定义行为的代码中。

您的环路

for (size_t i = 0; i < ahoj + 2; i++)
{
delete[] neco[i];
}

是不正确的,因为neco[i]都不是new表达式的结果。因此delete [] neco[i]在每次循环迭代中都有未定义的行为。

鉴于您的代码示例和描述不完整,我怀疑其他人是否能提供更有用的建议。

此外,您错误地认为不能使用标准容器。你可以。

#include <vector>
int main()
{
std::vector<int[2]> avec(ahoj + 2);     
int (*neco)[2] = &avec[0];
for (size_t i = 0; i < ahoj + 2; ++i)
{
for (size_t j = 0; j < 2; ++j)
{
neco[i][j] = iter;
++iter;
}
}
}

唯一的区别是avec为您执行动态内存分配和释放。neco仍然是根据API的需要(根据您的描述(指向数组的指针。这种方法的两个制约因素是:;

  • 初始化neco后不要调整avec的大小(或在调整avec的大小时重新初始化neco(
  • avec不存在之后不要使用neco(因为行为将不定义(

此外,没有一个数组实际上是静态的。所以你的问题标题有误。

如果我能正确回忆,数组(动态或静态(基本上就是一个矩阵。

因此,学术界的答案是:

分配内存的方法与分配内存的方式相同(首先分配数组数组的内存,然后使用for分配数组内数组的内存(,要释放内存,需要在for中删除数组内存,然后在简单的delete中释放动态数组的内存。

因此:

arrayOfArrays[[array1][array2][array3][array4]]

表示:分配arrayOfArrays的内存,然后在循环中,分配array(number)的内存

反之亦然。

单个句子中arrayOfArrays的自由记忆。