C++ 执行内存释放时出现调试错误

C++ 执行内存释放时出现调试错误,c++,compiler-errors,C++,Compiler Errors,下面代码的目的是将false值(-1)更正为right值,但是当我使用动态数组记录正确的值时,会发生调试错误。有人能帮我吗?谢谢 代码.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

下面代码的目的是将false值(-1)更正为right值,但是当我使用动态数组记录正确的值时,会发生调试错误。有人能帮我吗?谢谢

代码.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;
我发现在使用malloc时也会发生调试错误。当我取
delete[]码时
免费(代码),将发生调试错误。为什么?我不应该释放记忆吗

我用另一种方法解决这个问题,我使用
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;
}
map代码;
对于(int i=0;i我不能怀疑这些台词

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是否=0,否则您正在堆分配数组之外写入,这可能会导致堆损坏

另外,您是否有理由不将数组
code
完全替换为

std::vector<int> code
std::向量代码

请注意,当您为“代码”分配内存时,它没有初始化

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];
for(int i=0;i

这可能会导致DFS_CODE接收到未定义的值,这不是您的问题,而是可疑的…

在大小为n的DFS_CODE中,从可能的值是什么?我确信这些值是正确的。当我使用delete[]CODE;使用delete[]时会出现问题或者是免费的,因为您以前破坏了堆。在某个时候,您写入的数据超出了“代码”数组,因此修改了堆块中的下一个/上一个指针。这与delete[]无关或者免费。谢谢你的帮助!但是我仍然不能用动态数组解决这个问题…,但是我用
map
structure:)解决它。我非常确定你提到的条件在我的代码中不存在。我发现如果我采取
delete[]code;
out,错误将消失。但我不知道为什么。感谢您的回复:)@Mr.Mr通常在内存分配/释放(实际管理堆时)而不是内存访问时检测到堆损坏。@Mr.Mr您肯定应该使用delete[]代码。我只是说,损坏可能发生在这一点之前,并且只有在调用堆时才被检测到。我使用另一种方法来解决这个问题。谢谢你的帮助:)你能帮我解决这个问题吗?谢谢:)@Doug T。即使我初始化
code
,问题仍然会发生。可笑的是,如果一个take
delete[]code;
out,问题会解决…,但我认为不释放内存不是一个好主意,所以我使用
map
结构来解决这个问题。谢谢您的帮助:)
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];