C++ 删除时堆损坏[]
我在delete[]指令上遇到堆损坏错误。这个项目是在VC++2008中进行的,这是它的要求(所以请不要关注那个)。整个构建过程运行正常,但在运行时我遇到了错误:(prs_2013是我的项目名称) Windows已在prs_2013.exe中触发断点 这可能是由于堆损坏,这表明prs_2013.exe或其加载的任何DLL中存在错误 这也可能是由于用户在prs_2013.exe具有焦点时按下F12 输出窗口可能有更多诊断信息 这是发生错误的代码,它只是整个项目的一小部分,但错误仅限于此领域:C++ 删除时堆损坏[],c++,runtime-error,delete-operator,heap-corruption,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;
}
一切顺利
说实话,我真是束手无策,只是花了2-3天的时间试图找出我错过了什么。但大多数其他主题都与制作字符数组、字符串和数组长度的一般未命中计算有关。正如代码中所示,我总是将数组长度传递给其他函数
我确信有更好的代码来完成我必须要做的事情,但这是一个单独需要的项目,所以我不会寻找更好的功能来帮助我了解我对数组的错误。您的代码写入数组
temp
的越界索引时会损坏内存。当堆损坏时,任何事情都可能发生(比如delete[]
call上的崩溃)
您的temp
数组包含(size-1)*(size-1)
项,而它被视为双循环内的size*(size-1)
数组:temp[(i-1)*size+j-1]=…
(因为您将“第一个索引”乘以size
)
我想用
temp[(I-1)*temp\u size+j-1]
替换它可以解决问题。这就是使用原始指针、new
和delete
(或其数组对应项)进行手动内存管理时发生的情况。我建议使用RAII包装器,比如std::vector
。Boost还为多维数组提供了类这是一种使用原始指针进行错误内存管理时会发生的情况。我知道我可以使用已经生成的libs,但这超出了此项目的要求。除此之外,我不能使用任何其他库。我真的不能告诉你,但我甚至实现了链表和圆形缓冲区。当我试图在两天内不睡觉的情况下完成整个项目时,就会发生这种情况。非常感谢。我盯着显示器看了10个小时,眼睛都瞎了。从测试代码复制/粘贴时出错。想插话说我在delete
时遇到运行时错误,但没有任何错误消息。我花了一段时间才发现这就是原因。我为一些数组分配了很少的内存,并使用了越界索引。
#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");
}