无效的下一个大小和双重免费错误

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了无效的下一个大小和双重免费错误相关的知识,希望对你有一定的参考价值。

我这里有一些非常简单的代码行,但它们给了我一些严重的错误消息。

我的代码:

    #include <bits/stdc++.h>

    using namespace std;

    void solve( int n, unsigned long long k, int x){
        unsigned long long divi = 1000000007;
        std::vector< std::vector < unsigned long long > > dpArray( n, std::vector < unsigned long long >( 3, 0));
        dpArray[0][0] = 1;
        for(int index = 1; index < n; index++){
            dpArray[0][index] = (dpArray[1][index - 1] + dpArray[2][index - 1])%divi;
            dpArray[1][index] = (dpArray[0][index - 1] + dpArray[2][index - 1])%divi;
            dpArray[2][index] = ((k - 2)*dpArray[1][index])%divi;
        }

        int ans = 0;
        if(x == 1){
            ans = (int)dpArray[0][n - 1];
        }
        else{
            ans = (int)dpArray[1][n - 1];
        }
        std::cout << ans << std::endl;
    }

    int main(){
        int n = 0, x = 0;
        unsigned long long k;
        std::cin >> n >> k >> x;
        solve( n, k, x);
        return 0;
    }
  1. 下面是我输入100000 10000 1时的错误消息 151337967 Error in `./a.out': free(): invalid next size (fast): 0x0000000000818050 ======= Backtrace: ========= /lib/x86_64-linux-gnu/libc.so.6(+0x777e5)[0x7f90f9af97e5] /lib/x86_64-linux-gnu/libc.so.6(+0x8037a)[0x7f90f9b0237a] /lib/x86_64-linux-gnu/libc.so.6(cfree+0x4c)[0x7f90f9b0653c] ./a.out[0x401aee] ./a.out[0x401961] ./a.out[0x401730] ./a.out[0x401422] ./a.out[0x401210] ./a.out[0x401c77] ./a.out[0x401ab4] ./a.out[0x40190d] ./a.out[0x4016b1] ./a.out[0x40130c] ./a.out[0x400f86] ./a.out[0x401078] /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf0)[0x7f90f9aa2830] ./a.out[0x400bb9]

stdout中的第一行是正确的答案,但它给出了这个错误!

答案
std::vector< std::vector < unsigned long long > > dpArray( n, std::vector < unsigned long long >( 3, 0))

这会创建大小为[n][3]的向量。所以你在以下代码中访问索引

for(int index = 1; index < n; index++){
        dpArray[0][index] = (dpArray[1][index - 1] + dpArray[2][index - 1])%divi;
        dpArray[1][index] = (dpArray[0][index - 1] + dpArray[2][index - 1])%divi;
        dpArray[2][index] = ((k - 2)*dpArray[1][index])%divi;
    }

以上是关于无效的下一个大小和双重免费错误的主要内容,如果未能解决你的问题,请参考以下文章

在第6731次释放指针后双重免费或损坏

free():无效的下一个大小(快)字符串太长了? [重复]

realloc():C中的下一个大小无效[重复]

作业帮助,分段错误,双重释放或损坏,free():无效指针

free():fclose 上的下一个大小(正常)无效。但不是在 Valgrind 运行时[重复]

第 2 次运行代码后出现 C 双重释放错误