【发布时间】:2011-02-10 00:12:22
【问题描述】:
当我运行以下代码时,当我尝试使用 delete[] I[i] 命令时(总是在循环的最后一次运行),我不断收到 glibc 检测到的错误。就在试图删除 I[i] 的循环之前,我打印出 I 的最后一行中的值,它完全按照预期显示,所以我认为问题与循环无关太大。我究竟做错了什么? (我已经包含了 **I 出现的每一行代码)。
编辑 2:错误消息的全部内容是:
*** glibc detected *** getParams: free(): invalid next size (fast): 0x086861f0 ***
======= Backtrace: =========
/lib/tls/i686/cmov/libc.so.6(+0x6b591)[0x271591]
/lib/tls/i686/cmov/libc.so.6(+0x6cde8)[0x272de8]
/lib/tls/i686/cmov/libc.so.6(cfree+0x6d)[0x275ecd]
/usr/lib/libstdc++.so.6(_ZdlPv+0x21)[0x1cb741]
/usr/lib/libstdc++.so.6(_ZdaPv+0x1d)[0x1cb79d]
getParams[0x804ac78]
getParams[0x8048943]
/lib/tls/i686/cmov/libc.so.6(__libc_start_main+0xe6)[0x21cbd6]
getParams[0x8048731]
======= Memory map: ========
00110000-001f9000 r-xp 00000000 08:01 396979 /usr/lib/libstdc++.so.6.0.13
001f9000-001fa000 ---p 000e9000 08:01 396979 /usr/lib/libstdc++.so.6.0.13
001fa000-001fe000 r--p 000e9000 08:01 396979 /usr/lib/libstdc++.so.6.0.13
001fe000-001ff000 rw-p 000ed000 08:01 396979 /usr/lib/libstdc++.so.6.0.13
001ff000-00206000 rw-p 00000000 00:00 0
00206000-00359000 r-xp 00000000 08:01 11272305 /lib/tls/i686/cmov/libc-2.11.1.so
00359000-0035a000 ---p 00153000 08:01 11272305 /lib/tls/i686/cmov/libc-2.11.1.so
0035a000-0035c000 r--p 00153000 08:01 11272305 /lib/tls/i686/cmov/libc-2.11.1.so
0035c000-0035d000 rw-p 00155000 08:01 11272305 /lib/tls/i686/cmov/libc-2.11.1.so
0035d000-00360000 rw-p 00000000 00:00 0
0074f000-00773000 r-xp 00000000 08:01 11272350 /lib/tls/i686/cmov/libm-2.11.1.so
00773000-00774000 r--p 00023000 08:01 11272350 /lib/tls/i686/cmov/libm-2.11.1.so
00774000-00775000 rw-p 00024000 08:01 11272350 /lib/tls/i686/cmov/libm-2.11.1.so
00a7b000-00a7c000 r-xp 00000000 00:00 0 [vdso]
00d1c000-00d37000 r-xp 00000000 08:01 11276409 /lib/ld-2.11.1.so
00d37000-00d38000 r--p 0001a000 08:01 11276409 /lib/ld-2.11.1.so
00d38000-00d39000 rw-p 0001b000 08:01 11276409 /lib/ld-2.11.1.so
00ec8000-00ee5000 r-xp 00000000 08:01 11272275 /lib/libgcc_s.so.1
00ee5000-00ee6000 r--p 0001c000 08:01 11272275 /lib/libgcc_s.so.1
00ee6000-00ee7000 rw-p 0001d000 08:01 11272275 /lib/libgcc_s.so.1
08048000-0804c000 r-xp 00000000 08:01 4720134 /home/rkappiyo/Dropbox/xingResearch/finalMatlab/getParams
0804c000-0804d000 r--p 00003000 08:01 4720134 /home/rkappiyo/Dropbox/xingResearch/finalMatlab/getParams
0804d000-0804e000 rw-p 00004000 08:01 4720134 /home/rkappiyo/Dropbox/xingResearch/finalMatlab/getParams
08686000-086a7000 rw-p 00000000 00:00 0 [heap]
b7600000-b7621000 rw-p 00000000 00:00 0
b7621000-b7700000 ---p 00000000 00:00 0
b774f000-b7751000 rw-p 00000000 00:00 0
b7762000-b7765000 rw-p 00000000 00:00 0
bfcd4000-bfce9000 rw-p 00000000 00:00 0 [stack]
Aborted
编辑:我已将其更改为包含整个代码。
void invertMatrix(double **mat, int size) {
//index variables used for looping
int i, j, k;
//L and U are the LU decomposition of mat
double **L, **U;
//invMat is the inverted matrix, which will be stored in mat
double **invMat;
//I is the identity matrix
double **I;
L = new double *[size]; //allocation 1
for(i = 0; i < size; i++)
L[i] = new double[size]; //allocation 2
U = new double *[size]; //allocation 3
for(i = 0; i < size; i++)
U[i] = new double[size]; //allocation 4
//compute the LU decomposition of mat and store in L and U
LUDecomp(mat, size, L, U);
invMat = new double *[size]; //allocation 5
for(i = 0; i < size; i++)
invMat[i] = new double [size]; //allocation 6
I = new double *[size]; //allocation 7
for(i = 0; i < size; i++) {
I[i] = new double [size]; //allocation 8
for(j = 0; j < size; j++) {
if(i == j)
I[i][j] = 1;
else
I[i][j] = 0;
}
}
for(i = 0; i < size; i++) {
invMat[i][0] = I[i][0] / L[0][0];
for(j = 1; j < size; j++) {
invMat[i][j] = I[i][j];
for(k = 0; k < j; k++)
invMat[i][j] -= L[j][k] * invMat[i][k];
invMat[i][j] /= L[j][j];
}
}
for(i = 0; i < size; i++) {
mat[i][size - 1] = invMat[i][size - 1] / U[size - 1][size - 1];
for(j = size - 2; j > -1; j--) {
mat[i][j] = invMat[i][j];
for(k = j + 1; k < size; k++)
mat[i][j] -= U[j][k] * mat[i][k];
mat[i][j] /= U[j][j];
}
}
for(i = 0; i < size; i++) {
delete[] L[i]; //free allocation 2
delete[] U[i]; //free allocation 4
delete[] invMat[i]; //free allocation 6
delete[] I[i]; //free allocation 8
}
delete[] L; //free allocation 1
delete[] U; //free allocation 3
delete[] invMat; //free allocation 5
delete[] I; //free allocation 7
}
【问题讨论】:
-
我在这段代码中没有看到任何不正确的地方。您必须发布更完整的内容。
-
另外,如果您在受支持的系统上运行,请尝试在您的代码上使用 Valgrind (valgrind.org)。
-
您的代码没有显示
mat的分配方式;你能检查一下所有的分配是正确的吗? -
这几乎肯定意味着某些东西(就我所见,不在您显示的代码中)正在写入超出内存块的末尾,或者在写入内存之后写入内存删除。我还建议 Valgrind 追踪这种事情。
-
嗯,这有点尴尬...我不确定为什么我的 test.cpp 文件(我删除了对除我之外的所有内容的引用)出错了,但原因是主要代码不起作用是因为我是个白痴...我使用 for(i = 0; i