【问题标题】:c++ . When to delete a C-style array to free memoryc++ 。何时删除 C 样式数组以释放内存
【发布时间】:2017-04-17 18:57:09
【问题描述】:

我编写了一个将公斤转换为磅和石头的代码。一个 sn-p 如下所示。

float *weightoutput =  weight_conversion(weight);

具有如下功能。我使用了一个 C 风格的数组,

float* weight_conversion(float x){

float *stones_pounds = new float[2];  //C-style array 
float z, y;
z = x*0.15747304441776971; // (1 stone = 6.3503 kilo)
y = x*2.2026;              // (1 kilo = 2.2026 pounds)
stones_pounds[0] = z;
stones_pounds[1] = y;

return stones_pounds;
}     

我在多篇文章中读到,如果您使用“new”,则必须使用“delete”来释放内存。我的问题是,如何在此设置中删除stone_pounds。由于 stone_pounds 一直使用到函数中的最后一行作为回报,我认为我不能在函数中使用 delete [] stone_pounds。由于它不是全局变量,因此我也无法在主函数中删除它。那么如何使用 delete[] 运算符来释放内存呢?改变代码结构以方便 delete[] 运算符的唯一替代方法是什么?

【问题讨论】:

  • 为什么不使用std::vectorstd::array?编辑:在这种情况下,您实际上可以返回一个std::pair<float, float>,这可能会更清晰
  • 请参阅this question on returning arrays。您仍然可以在返回中使用 C 样式的数组,而根本不需要使用 new[](通过使用 struct)。
  • 见鬼,为什么不直接返回struct
  • 顺便说一句:x 是什么? z 是什么? y 是什么?这些变量名称对输入或结果没有任何意义。除非您可能需要返回 10、50 甚至 1000 个值(即,如果它始终只有两个值),否则具有明确名称(以及函数的明确参数名称)的数据结构会使这段代码变得很多更清楚它在做什么。
  • @RyanP 我同意。在我转向 std::vector 之前,我只是在尝试这个选项。

标签: c++ delete-operator


【解决方案1】:

std::array 可能是您想要的更好的选择,然后在此示例中使用 newdelete

话虽如此,您返回new-ed 指针并将结果存储为float *weightoutput。要释放内存,您应该在完成后通过delete [] weightoutput; 调用delete

【讨论】:

  • 同意,std::array 是更好的选择。我将用 std::array 替换 'new',但好奇心占了上风。所以我想在继续之前尝试一下。
猜你喜欢
  • 2015-10-15
  • 2017-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-05
  • 1970-01-01
  • 2019-04-17
相关资源
最近更新 更多