我有类似于这个的代码
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
的自由记忆。