zoukankan      html  css  js  c++  java
  • 【free() invalid next size】谨慎地在C++的类中存储指针来方便访问其他节点

    “我跟你们说,你们知道STL容器,vector/string/deque等等,都有个reserve方法吗?你们一个个地push_back,嫌C++比C慢,怪谁?”

    “要像我这样,预先分配足够大的空间,这样push_back的时候才快,明不明白?”

    “别老说写C比写C++好,因为C代码怎么运行的都在自己掌控之中,还快,那是因为你们不懂C++。”

    ----------------------------------------------------------------------------------------------------------------------------------------

    #include <cstdio>
    #include <vector>
    using namespace std;
    
    struct Node
    {
        int i = 0;
        Node* next = nullptr;
        Node(int _i) : i(_i) { }
    };
    
    const int N = 3;  // 某人以为的"足够大"的数
    vector<Node> odd; // 存放偶数: 0,2,4,6...
    // 偶数节点指向比自己大1的奇数节点
    vector<Node> even; // 存放奇数: 1,3,5,7...
    // 奇数节点指向比自己小1的偶数节点
    
    // 于是对于Node node, 只需调用node.next->i就能实现node.i ^ 1这样的亦或运算
    // [不要考虑这个功能意义在哪]
    
    void init()   // 初始化, 两个vector都申请"足够多"的空间
    {
        odd.reserve(N);
        even.reserve(N);
    }
    
    void add()
    {
        if (!even.empty())
        {
            even.push_back(odd.back().i + 1); // 插入2n+1
            odd.push_back(even.back().i + 1); // 插入(2n+1)+1=2n+2
        }
        else
        {
            even.push_back(0);
            odd.push_back(1);
        }
        odd.back().next = &even.back(); // 2n+1指向2n+2
        even.back().next = &odd.back(); // 2n+2指向2n+1
    }
    
    void XOR_Simulate()
    {
        for (int i = 0; i < 3; i++)
            add();
        printf("%d ^ 1 = %d
    ", odd[0].i, odd[0].next->i);
        printf("%d ^ 1 = %d
    ", even[0].i, even[0].next->i);
    }
    
    int main()
    {
        init();
        printf("run XOR_Simulate()
    ");
        XOR_Simulate();
        printf("OK, now, run XOR_Simulate() again!
    ");
        XOR_Simulate();
        return 0;
    }
    

    直接上代码,贴几个运行结果

    唉,都不想多说了,我今天还就踩了这么弱智的陷阱。只不过在较多的代码中没有正确地找到原因。

    这种隐藏的错误刚开始的时候不会出现什么问题,而到了后面,这颗定时炸弹被引爆的时候,只能手足无措地看着segmentation fault或者由于abort()以错误free() invalid next size开头的一大段Memory Map信息。

  • 相关阅读:
    商城问题
    web基础重难点
    业务流程
    主流框架面试题
    数据库:索引-引擎-优化
    【jquey代码】基于选中的checkbox 删除对应的一行数据
    javascript中获取json对象的value,拼接到页面上
    【json对象和json格式的字符串】
    【idea中创建springMVC项目的2个坑】不识别@Autowired 以及 Mapper.xml的配置
    【eclipse和idea】创建spring项目时的一处不同
  • 原文地址:https://www.cnblogs.com/Harley-Quinn/p/6667111.html
Copyright © 2011-2022 走看看