Igo*_*gor 3 c++ runtime-error delete-operator heap-corruption
我一直在delete []指令上遇到堆损坏错误.项目是在VC++ 2008中进行的,其要求是(所以请不要关注它).整个构建过程运行正常,但在运行时我得到错误:(prs_2013是我的项目的名称)
Windows已在prs_2013.exe中触发了断点.
这可能是由于堆的损坏,这表示prs_2013.exe或它已加载的任何DLL中的错误.
这也可能是由于用户在prs_2013.exe具有焦点时按下F12.
输出窗口可能包含更多诊断信息.
这是发生错误的代码,它只是整个项目的一小部分,但错误仅限于此区域:
// Function used for swapping row of matrix with new values
void Main::swap(double* matrix, double* row, unsigned index, unsigned size){
double temp = 0;
for(unsigned i = 0; i < size; i++){
temp = matrix[i*size + index];
matrix[i*size + index] = row[i];
row[i] = temp;
}
}
// Function that do some calculations, not really relevant for this problem
// but still used in code
double Main::determinat(double* matrix, unsigned size){
double ud = 0, du = 0;
for(unsigned j = 0; j < size; j++){
double ude = 1, due = 1;
for(unsigned i = 0; i < size; i++){
ude *= matrix[i*size + (i+j)%size];
due *= matrix[(size-i)*size + (i + j)%size];
}
ud += ude;
du += due;
}
return ud - du;
}
// Function in which error occurs
double* Main::get_x(double* matrix, unsigned size){
// error checking
if(size == 1){return NULL;}
double *x = new double[size];
x[0] = 1;
unsigned const temp_size = size-1;
double *temp = new double[temp_size * temp_size]; // temporary matrica
double *x0_coef = new double[temp_size]; // variable on which error occures
for(unsigned i = 0; i < temp_size; i++)
x0_coef[i] = matrix[i*size + 0] / s[0]; // s is class member, init in constructor s[0] != 0
for(unsigned i = 1; i < size; i++)
for(unsigned j = 1; j < size; j++)
if(i == j)
temp[(i-1)*size + j-1] = (matrix[i*size + j] - 1) / s[i];
else
temp[(i-1)*size + j-1] = matrix[i*size + j] / s[i];
double deltaS = determinat(temp, temp_size); // delta of system
for(unsigned i = 0; i < temp_size; i++){ // delta of vars
swap(temp, x0_coef, i, temp_size);
x[i+1] = determinat(temp, temp_size) / deltaS;
swap(temp, x0_coef, i, temp_size);
}
delete[] x0_coef; // place where error occures
delete[] temp;
return x;
}
Run Code Online (Sandbox Code Playgroud)
但如果我切换delete[] x0_coef;,同样的事情发生delete[] temp;,临时发生错误;
正如您在代码中看到的那样,我不使用char,即.制作字符串所以添加'\ 0'是没用的,因为0仍然是有效值.
但现在有趣的部分,我用这段代码测试了交换函数:
#include <iostream>
using namespace std;
void swap(double* a, double* b, unsigned size){
double temp = 0;
for(unsigned i=0; i < size; i++){
temp = a[i];
a[i] = b[i];
b[i] = temp;
}
}
void main(){
double *a = new double[5],
*b = new double[5];
for(unsigned i=0; i < 5; i++){
a[i] = i;
b[i] = i*i;
}
swap(a, b, 5);
for(unsigned i=0; i < 5; i++)
std::cout << "a: " << a[i] << " b: " << b[i] << endl;
delete[] a;
delete[] b;
system("PAUSE");
}
Run Code Online (Sandbox Code Playgroud)
一切顺利.
说实话,我已经结束了我的智慧,只花了2-3天试图找出我所缺少的东西.但是大多数其他主题都与制作char数组,字符串和数组长度的一般未命中计算有关.正如代码中所示,我总是将数组长度传递给其他函数.
我确信有更好的代码可以做我必须做的事情,但这是单独需要的项目,所以我不是在寻找更好的功能只是为了帮助我看看我在做什么错误的数组.
您的代码在写入数组的越界索引时会破坏内存temp.当堆损坏时,任何事情都可能发生(比如delete[]电话崩溃).
你的temp数组包含(size-1)*(size-1)项目,而它size*(size-1)在double循环中被视为一个数组:( temp[(i-1)*size + j-1] = ...因为你将"第一个索引"乘以size).
我想用它替换它temp[(i-1)*temp_size + j-1]会解决问题.