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,还是在最后一个支架之前的线上放入线?
代码中有三个位置可以从函数返回:
return 5行了return 0线后的环为了不泄漏资源,必须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)
| 归档时间: |
|
| 查看次数: |
151 次 |
| 最近记录: |