我有与此类似的代码
EDIT 此代码应该在接口上,因此仅允许POD。没有载体,没有容器。
.fbx
这不起作用。删除将删除未分配的内存。 甚至没有
delete [] neco;
或任何其他删除。他们每个人都在分配的块之前删除了内存。
在办公室与同事进行谷歌搜索和咨询没有结果。 :)
如何分配“点”(两个坐标)的动态数组,然后释放它们?
我能够通过使用不同的结构来解决问题。
但是我显然可以分配内存。写在分配的内存中……
如何正确释放此内存? (只是一个学术问题。)
答案 0 :(得分:1)
指向动态分配内存的简单指针使您陷入麻烦。
#include <memory>
// ...
std::unique_ptr<int[][2]> neco(new int[ahoj+2][2]);
并使用delete[]
删除该循环。
或者,使用std::vector<int[2]> neco(ahoj+2)
-它为您执行内存管理并且可以调整大小。
答案 1 :(得分:1)
一般规则是,每个new
表达式都必须由一个相应的delete
表达式匹配。
您的new
表达式位于语句的右侧
neco = new int[ahoj+2][2];
因此在语句中给出了相应的delete
表达式
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要求的数组指针(根据您的描述)。这种方法的两个限制是;
avec
后不要调整neco
的大小(或在neco
调整大小时重新初始化avec
)neco
不再存在后不要使用avec
(因为行为将是不确定的)。此外,所有数组实际上都不是静态的。因此,您的问题名称不正确。
答案 2 :(得分:0)
如果我可以正确地回忆起,数组(动态或静态)数组基本上就是矩阵。
所以,学术上的答案:
分配内存的方式相同(首先分配数组的内存,然后用for
分配数组内部的数组的内存),要释放它,您需要删除for
数组的内存,然后在简单的delete
中释放动态数组的内存。
所以:
arrayOfArrays[[array1][array2][array3][array4]]
表示:分配arrayOfArrays
的内存,然后在循环中分配array(number)
的内存
相同则相反。
arrayOfArrays
的单个句子中的可用内存。