以下代码的目的是将false值(-1)更正为正确的值,但是当我使用动态数组记录正确的值时,会发生调试错误。有人能帮我吗?感谢。
code.cpp
int size = DFS_CODE.size();
int *code = new int[DFS_CODE.size()];
for(int i = 0; i < DFS_CODE.size(); i++) {
if(DFS_CODE[i].fromlabel == -1)
DFS_CODE[i].fromlabel = code[DFS_CODE[i].from];
else if(DFS_CODE[i].tolabel == -1)
DFS_CODE[i].tolabel = code[DFS_CODE[i].to];
code[DFS_CODE[i].from] = DFS_CODE[i].fromlabel;
code[DFS_CODE[i].to] = DFS_CODE[i].tolabel;
cout << DFS_CODE[i].from << "(" << DFS_CODE[i].fromlabel << ") => "
<< DFS_CODE[i].to << "(" << DFS_CODE[i].tolabel << ")" << endl;
}
delete [] code;
调试错误
debug error!
HEAP CORRUPTION DETECTED:after Normal block(#1363) at 0x005745F0.
CRT detected that the application wrote to memory after end of heap buffer.
我发现使用malloc时也会发生调试错误。当我执行delete [] code;
或free(code);
时,将发生调试错误。为什么?我不应该释放记忆吗?
我通过另一种方式解决了这个问题,我使用map
struct来存储正确的值。感谢所有帮助我的人!最好的问候!
map <int, int> code;
for(int i = 0; i < DFS_CODE.size(); i++) {
if(DFS_CODE[i].fromlabel != -1)
code[DFS_CODE[i].from] = DFS_CODE[i].fromlabel;
if(DFS_CODE[i].tolabel != -1)
code[DFS_CODE[i].to] = DFS_CODE[i].tolabel;
cout << DFS_CODE[i].from << "(" << code[DFS_CODE[i].from] << ") => "
<< DFS_CODE[i].to << "(" << code[DFS_CODE[i].to] << ")" << endl;
}
答案 0 :(得分:2)
对我来说可疑这些行
code[DFS_CODE[i].from] = DFS_CODE[i].fromlabel;
code[DFS_CODE[i].to] = DFS_CODE[i].tolabel;
按照以下方式分配代码
int *code = new int[DFS_CODE.size()];
确保检查.from和.to是否&lt; DFS_CODE.size()和&gt; = 0,否则您在堆分配的数组之外写入,这可能导致堆损坏。
另外,有没有理由不用
完全替换数组code
std::vector<int> code
答案 1 :(得分:0)
请注意,当您为“代码”分配内存时,它不会被初始化
int *code = new int[DFS_CODE.size()];
以下代码使用它......
for(int i = 0; i < DFS_CODE.size(); i++) {
if(DFS_CODE[i].fromlabel == -1)
DFS_CODE[i].fromlabel = code[DFS_CODE[i].from];
else if(DFS_CODE[i].tolabel == -1)
DFS_CODE[i].tolabel = code[DFS_CODE[i].to];
这可能导致DFS_CODE接收未定义的值,这不是你的问题,但是可疑......