gpt4 book ai didi

c++ - 在循环中放置 "delete"的位置

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:10:55 33 4
gpt4 key购买 nike

假设我有以下代码:

int decreasingTest(int number){
int numberOfDigits = 0; do { number /= 10; numberOfDigits++; } while (number != 0);
int *arrayValue = new int[numberOfDigits + 1];
for(int i = numberOfDigits;0<=i;i--){ //acquire digits of number
arrayValue[i] = (number - fmod(number, pow(10, i))) / pow(10, i);
number = fmod(number, pow(10, i));
i--;
}
for (int j = 0; j < sizeOfArray; j++){
if (arrayValue[j + 1] <= arrayValue[j]){
if ((j + 1) == sizeOfArray){
cout << "The number's digits are decreasing." << endl;
return 5;
}
continue;
}
return 0;
}

我是否应该将 delete arrayValue[] 放在 return 0 之前的行和 continue 之后的括号之后, 行之后返回 0,还是在最后一个括号之前的行?

最佳答案

在您的代码中,您可以在三个地方从函数返回:

  1. return 5
  2. return 0 行,在循环之后
  3. 在右大括号之前,如果外层循环永远不会执行。

为了不泄漏资源,必须为每个执行的 new 调用执行一个 delete 调用。在你的例子中,因为你有两个返回点,你需要两个 delete 调用——一个就在每个返回点之前。

像您在这里那样手动管理动态内存是有问题的。很容易忘记删除某些内容,尤其是当您有多个返回点时。已经构建了许多语言功能和库组件来解决这个问题。像 shared_ptr 这样的智能指针和 unique_ptr自动管理动态分配资源的销毁,因此您根本不需要编写 deletemake_sharedmake_unique 使您永远不会甚至编写 new。 (注意:make_unique不在C++11标准中,但是写起来很容易,预计会在C++14标准中。)

由于多种原因,C 样式数组本身也存在问题。最明显的一个是它们的固定大小和经常伴随它们的神奇数字。语言特性和库组件的存在也可以解决这个问题,我建议作为一条规则,你应该(几乎)永远不要使用 C 风格的数组。相反,使用 vector .

在您的情况下,您根本不需要指针。你只需要一个“vector ”:

std::vector <int> arrayValue;
for(int i = numberOfDigits;0<=i;i--){ //acquire digits of number
arrayValue.push_front(number - fmod (number, pow(10, i))) / pow(10,i);
//arrayValue[i] = (number - fmod(number, pow(10, i))) / pow(10, i);
number = fmod(number, pow(10, i));
i--;
}

...

关于c++ - 在循环中放置 "delete"的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27638268/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com