【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信息。
【free() invalid next size】谨慎地在C++的类中存储指针来方便访问其他节点的更多相关文章
- C/C++动态分配连续空间,下标越界导致的free():invalid next size问题
昨天帮导师做的一个程序出了内存泄露的bug(在VS上程序运行一切正常,等return返回后才出错) 而且是程序运行结束后才出现的错误,在退出前一切代码都顺利执行完了,只是return之后出错. 之后我 ...
- C语言扩展动态内存报错:realloc(): invalid next size: 0x0000000002365010 ***
晚上被这个内存扩展崩溃的问题折腾的有点崩溃,当答案揭晓的那一刻,恍然大悟,原来如此简单. 练习题目:输入一个字符串,根据字母进行排序,说白了就是一个简单的冒泡 #include <stdio.h ...
- java.util.zip.ZipException: invalid entry size 解决办法
启动maven项目时报java.util.zip.ZipException: invalid entry size (expected 7612 but got 5955 bytes) 可能是mave ...
- C 语言 *** glibc detected *** free(): invalid next size (fast): 0x0000000000be1010 ***
. . . . . LZ 今天在写一个 Socket 程序的时候使用 malloc(3) 在堆上动态分配了一个结构体的空间,在使用完之后用 free(3) 函数释放空间的时候报 invalid nex ...
- free(): invalid next size (fast/normal)问题
本文转自 http://blog.sina.com.cn/s/blog_77f1e27f01019qq9.html ,在此感谢! c++编译常会出现free(): invalid next size ...
- Error : Invalid Allocation Size :·····Bytes 以及 abort() has been called
把这两个Error放在一起,主要是因为在写代码的时候发现,他们有公共的错误. (一)Invalid Allocation Size 主要是因为new分配内存出了问题,从直观翻译来看,应该是内存分配长度 ...
- java.util.zip.ZipException: invalid entry size
启动maven项目时报java.util.zip.ZipException: invalid entry size (expected 7612 but got 5955 bytes) 可能是mave ...
- Solve Error: "errcode": 40016, "errmsg": "invalid button size hint"
在使用微信官方给的添加自定义菜单的示例代码: { "button": [ { "name": "扫码", "sub_button& ...
- R语言 启动报错 *** glibc detected *** /usr/lib64/R/bin/exec/R: free(): invalid next size (fast): 0x000000000263a420 *** 错误 解决方案
*** glibc detected *** /usr/lib64/R/bin/exec/R: free(): invalid next size (fast): 0x000000000263a420 ...
随机推荐
- Tomcat启动报StackOverflowError
近期工程部署到Tomcat时,出现以下异常: 16-May-2018 09:35:25.590 严重 [localhost-startStop-1] org.apache.catalina.core. ...
- sqlmap简单使用方法
sqlmap使用 注入点 http://1xx.xxx.xxx.xxxx/dvwa/vulnerabilities/sqli/index.php?id=1&Submit=Submit# 通 ...
- Redis之持久化
Redis 持久化 提供了多种不同级别的持久化方式:一种是RDB,另一种是AOF. RDB方式的持久化是通过快照(snapshotting)完成的,当符合一定条件时Redis会自动将内存中的所有数据进 ...
- php 数值数组
<?php $cars=array("Volvo","BMW","Toyota"); echo ] . ] . ] . ". ...
- python stat获取文件信息
import os statinfo = os.stat('qqq.txt') print(statinfo,"\n") print(statinfo.st_mode) 输出 os ...
- XML_CPP_资料
1.TinyXML解析xml文档 - zhoubl668的专栏:远帆,梦之帆! - 博客频道 - CSDN.NET.html http://blog.csdn.net/zhoubl668/articl ...
- [OSG]OSG的相关扩展
参考:osg官网 http://www.osgchina.org/index.php?view=article&id=176 http://trac.openscenegraph.org/pr ...
- Java中的String和StringBuffer
在任何编程语言中,字符串都是我们编写程序时不可避免要用到的常用的数据类型之一. 对于Java初学者而言,当谈到String和StringBuffer的区别时,通常都会有些困惑. 而要弄清楚两者之间的区 ...
- 【Python】实现对大文件的增量读取
背景 前段时间在做一个算法测试,需要对源于日志的数据进行分析才能获取到结果:日志文件较大,所以想要获取数据的变化曲线,增量读取是最好的方式. 网上有很多人的技术博客都是写的用for循环readline ...
- Rails 5 Test Prescriptions(everday Rspectest作者推荐) 目录 1-3章
总文档连接: RSpec.info/documentation/ 如何使用TDD 和 自动化测试来建立一个Rails app. TDD让你用测试来探索代码的设计.你将学习可利用的工具,并学习用什么工具 ...