免费动态数组的静态数组?

时间:2018-10-26 08:35:06

标签: c++ memory dynamic-arrays

我有与此类似的代码

EDIT 此代码应该在接口上,因此仅允许POD。没有载体,没有容器。

.fbx

这不起作用。删除将删除未分配的内存。 甚至没有

delete [] neco;

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

在办公室与同事进行谷歌搜索和咨询没有结果。 :)

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

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

但是我显然可以分配内存。写在分配的内存中……

如何正确释放此内存? (只是一个学术问题。)

3 个答案:

答案 0 :(得分:1)

指向动态分配内存的简单指针使您陷入麻烦。

使用std::unique_ptr

#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的单个句子中的可用内存。