所以我有代码:
float **array = new float*[width + 1]; //old line was '= new float*[width]'
//Create dynamic 2D array
for (int i = 0; i < width; ++i) {
array[i] = new float[height + 1]; //old line was '= new float[height]'
}
//Hardcode 2D array for testing
for (int i = 0; i < height; ++i) {
for (int j = 0; j < width; ++j) {
array[i][j] = i + j;
}
}
//deallocate heap memory
for (int i = 0; i < width; ++i) {
delete [] array[i]; //Where corrupted memory error used to be
}
delete [] array;
(为了记录,我知道分配单个内存块会更有效,但我与那些永远无法理解为什么/如何使用它的科学家密切合作。因为它在服务器上运行,老板说这是首选。)
我的问题是为什么高度+ 1 /宽度+ 1修复了损坏的内存问题?我知道额外的空间是空终止符,但为什么有必要呢?为什么它在高度和宽度相同时才起作用,但在它们不同时会断裂?
SOLN: 在填充我的阵列时,我的身高/宽度向后...... -.-;感谢NPE。
答案 0 :(得分:3)
以下评论是红鲱鱼:
delete [] array[i]; //Where corrupted memory error used to be
这不是发生内存错误的地方。这是它被检测到的地方(由C ++运行时)。请注意,运行时没有义务检测this sort of errors,因此在某种程度上它可以帮到你。 : - )
您的代码中未显示的部分中有buffer overrun(可能是循环中的一个错误)。
如果您无法通过检查代码找到它,请在GCC中尝试Valgrind或-fsanitize=address
。
修改:您在问题中添加的代码存在问题:
//Hardcode 2D array for testing
for (int i = 0; i < height; ++i) {
for (int j = 0; j < width; ++j) {
array[i][j] = i + j;
}
}
它有width
和height
(或等同地,i
和j
)错误的回合方式。除非width == height
,否则您的代码有undefined behaviour。
答案 1 :(得分:1)
根据身高+ 1和体重+ 1改变身高和体重可能还不够。 您发布的代码在身高和体重方面都是正确的。
这意味着某些东西很可能在代码的其他部分写入这些数组的末尾,并且当您增长这些数组时,它会使错误的代码在数组的末尾写入而不是崩溃。你没有解决这个问题,你只是隐藏了它。
由于操作系统检测到堆损坏的一些限制,代码实际上在delete []上崩溃了。通常,下一次调用new / delete / malloc / free时会检测到堆上的逐个错误,而不是实际发生时。
如果您想知道程序使用指针执行非法操作的确切时间和位置,您可以使用像Valgrind这样的工具。
答案 2 :(得分:0)
您没有修复代码。您正在做的是使用新代码更改可执行文件,从而将损坏错误移至程序的另一部分。
您应该不做的一件事 - 不要将您的程序更改为您使用+ 1
“工作”的程序,然后接受它。我知道如果这个bug难以诊断可能很诱人,但不要走这条路。
你必须做的是回到非工作版本,并真正解决问题。通过“修复”,意味着您可以解释修复的作用,解决问题的原因等等。