它在程序结束时被调用,在"删除";序列,我想。这个程序一直运行得很好,除了结尾。
#include <iostream>
#include <cmath>
//Завдання 2, покажчикі
using namespace std;
int main()
{
int n = 10;
cout << "Input N (size of arrays): ";
cin >> n;
float* X = new float[n+1];
float* A = new float[n + 1];
float* max;
float* B = new float[n];
cout << "Input your X array (10 elems): " << endl;
//Логарифм від нуля завжди буде нескінченністю, отже, маємо рахувати з 1
for (int i = 1; i <= n; i++) {
cin >> X[i];
A[i] = cos(pow(X[i], 2)) + 4.5 * pow(log(pow(i, 2)), 2) + i;
}
max = new float( A[1]);
cout << "Your A array: " << endl;
for (int i = 1; i <= n;i++) {
if (A[i] > *max) max = &A[i];
cout << A[i] << " ";
}
cout << "nYour B array: " << endl;
for (int i = 0; i < n; i++) {
B[i] = A[i + 1] / *max;
cout << B[i] << " ";
}
delete max;
delete[] X, A, B;
}
我试图在开始时初始化max,使其值为&A[0](我知道数组在初始化时会填充随机值,这无关紧要(。然后,我尝试在第一个";对于";环状:
for (int i = 1; i <= n; i++) {
cin >> X[i];
A[i] = cos(pow(X[i], 2)) + 4.5 * pow(log(pow(i, 2)), 2) + i;
if (i == 1) max = &A[i];
else if (A[i] > *max) max = &A[i];
}
您已经在评论中被告知,您的代码没有遵循最佳实践,很难阅读和维护。我读了很多遍才明白它的作用。。。
错误的原因是delete max;
指令。您知道每个new
必须有一个delete
,但您应该删除用new
分配的内容。您可以更改此代码中max
(而不是*max
(的值。。。因此:
- 您泄漏了原始分配的float对象(不是错误的直接原因,但可能会导致长时间运行的程序出现问题(
- 您试图删除未分配给new的变量(直接原因(
我不明白为什么你必须使用一个分配的浮点值而不是一个简单的变量,但正如你已经解释过的,你必须混合一个和零基数索引(这是以后问题的保证…(,我不会这么做。但您必须保存分配的浮点值的地址,并在以后使用它来删除对象:
...
float* max, *max0;
...
max0 = max = new float( A[1]);
...
delete max0;
...
但IMHO这只会修复当前的错误,而您应该考虑根据最佳实践重写整段代码。。。