在循环中放置"删除"的位置

Don*_*ynx 1 c++ delete-operator

假设我有以下代码:

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;
}
Run Code Online (Sandbox Code Playgroud)

}

我应该在支架delete arrayValue[]之前return 0和之后continue,在线之后return 0,还是在最后一个支架之前的线上放入线?

Joh*_*ing 6

代码中有三个位置可以从函数返回:

  1. 就return 5行了
  2. 上return 0线后的环
  3. 在结束括号之前,如果外部循环从不执行.

为了不泄漏资源,必须delete为每个new执行的调用执行一次调用.在您的情况下,由于您有两个返回点,您需要两个delete调用 - 一个在每个返回点之前.

在这里手动管理动态内存是有问题的.忘记删除某些内容非常容易,尤其是当您有多个返回点时.已经构建了许多语言功能和库组件来解决此问题.像shared_ptr和unique_ptr这样的智能指针可以自动管理动态分配资源的破坏,因此您根本不需要编写delete,make_shared并且make_unique使您甚至不会编写new.(注意:make_unique不是在C++ 11标准中,但它很容易编写,并且它应该在C++ 14标准中.)

出于多种原因,C风格阵列本身也存在问题.其中最明显的是它们的固定大小和经常伴随它们的神奇数字.语言特性和库组件也存在以解决这个问题,我建议通常,你(几乎)不应该使用C风格的数组.相反,使用矢量.

在您的情况下,您根本不需要指针.你只需要一个'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--;
}

...
Run Code Online (Sandbox Code Playgroud)