【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\n", odd[0].i, odd[0].next->i);
    printf("%d ^ 1 = %d\n", even[0].i, even[0].next->i);
}

int main()
{
    init();
    printf("run XOR_Simulate()\n");
    XOR_Simulate();
    printf("OK, now, run XOR_Simulate() again!\n");
    XOR_Simulate();
    return 0;
}

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

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

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

时间: 2024-10-08 20:49:36

【free() invalid next size】谨慎地在C++的类中存储指针来方便访问其他节点的相关文章

C语言扩展动态内存报错:realloc(): invalid next size: 0x0000000002365010 ***

晚上被这个内存扩展崩溃的问题折腾的有点崩溃,当答案揭晓的那一刻,恍然大悟,原来如此简单. 练习题目:输入一个字符串,根据字母进行排序,说白了就是一个简单的冒泡 #include <stdio.h> #include <stdlib.h> #include <stdbool.h> #include <string.h> #define BUF_LEN 100 #define COUNT 5 int main(void) { char buf[BUF_LEN];

free(): invalid next size (fast/normal)问题

本文转自 http://blog.sina.com.cn/s/blog_77f1e27f01019qq9.html  ,在此感谢! c++编译常会出现free(): invalid next size (fast)或者是free(): invalid next size (normal)的问题,这大多数是内存泄漏的问题.经常出现的情况是动态数组赋值越界,导致最后在进行free时候,出现内存泄漏.解决方法,只能首先定位,然后一步一步自查,发现对数组的操作,然后慢慢带入,考虑极端情况(数组下标过大,

C 语言 *** glibc detected *** free(): invalid next size (fast): 0x0000000000be1010 ***

. . . . . LZ 今天在写一个 Socket 程序的时候使用 malloc(3) 在堆上动态分配了一个结构体的空间,在使用完之后用 free(3) 函数释放空间的时候报 invalid next size 这样的一个错误,经过了两个小时的调试,最后发现是因为粗心越界导致的. LZ 把这个错误缩减为一个最简单的模型发布出来: 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 5 i

blurImage做图片模糊处理报错free(): invalid next size

$image = new Imagick($url); $image->blurImage($x, $y); 调用blurImage($x, $y)函数报错: 原因是:原来的图片是CMYK的是印刷模式的.改为RGB显示模式就好用了! ! ! !! ! !!.!! *** glibc detected *** /data/php/bin/php: free(): invalid next size (fast): 0x00007f04340024b0 *** ======= Backtrace:

Error : Invalid Allocation Size :&#183;&#183;&#183;&#183;&#183;Bytes 以及 abort() has been called

把这两个Error放在一起,主要是因为在写代码的时候发现,他们有公共的错误. (一)Invalid Allocation Size 主要是因为new分配内存出了问题,从直观翻译来看,应该是内存分配长度无效. 检查一下程序里面开辟动态内存的地方,代表长度的变量是否具有正确的值: 可能有时候该变量未被初始化,此时很有可能就是一个随机的负值. 可能该长度的值需要从文件中读取,要仔细检查一下读取文件的时候,读的时候各个量的值是否对应正确. (二)abort() has been called 该Erro

Solve Error: &quot;errcode&quot;: 40016, &quot;errmsg&quot;: &quot;invalid button size hint&quot;

在使用微信官方给的添加自定义菜单的示例代码: { "button": [ { "name": "扫码", "sub_button": [ { "type": "scancode_waitmsg", "name": "扫码带提示", "key": "rselfmenu_0_0", "sub_butto

【翻译自mos文章】在一个使用uniform size的 本地管理的表空间中建立一个表,为什么会忽略INITIAL 参数?

翻译:Why Does a Table Created in a Locally Managed Tablespace With Uniform Extents Ignore INITIAL? (文档 ID 753662.1) 在一个使用uniform size的 本地管理的表空间中建立一个表,为什么会忽略INITIAL 参数? 适用于: Oracle Database - Enterprise Edition - Version 8.1.5.0 to 11.1.0.7 [Release 8.1

微信公众平台项目中遇到的小问题40016,Invalid button size

刚辞职的同事用JAVA给客户开发的微信公众平台,今天晚上客户给我打电话说出现错误,此时我正跟朋友在外吃饭,联系已辞职的同事也联系不上,便答应回去之后我给调试看下. 问明客户说就修改了appkey和appsecret两个串值,试了下公众号才看出请求的url中的appid还是老的,便利用开发者接口测试工具经过多次实验后才发现原来是创建自定义菜单的json字符串错误,提交的json字符串格式如: {"menu":{"button":[{"name":&

Linux: 运行报错: free(): invalid next size (fast):

> 解决办法: >> 在调用malloc或calloc, 至少多分出一个字节, 不要用这个字节