delete数组引发的core分析

delete [] ptr 引发了singnal 6 abort的core错误,跟踪过程发现写入ptr大量数据,引发内存越界,破坏了new数组的尾部数据保护,导致delete的时候core。

问题分析过程写了一段测试代码,发现另外一些编辑器或者说操作系统的性质,new申请的数组总是分配2的n次方的空间,比如char* ptr = new char[10]实际分配了16个字节的空间 ,char* ptr2 = new char[15]同样分配了16个空间的字节,而char* ptr3 = new char[16]则分配了32个字节的空间,由此推测new出来的数组尾部有一个字节的特殊字符用于保护。

虽然找到core的原因,但还是对系统new和delete的内存分配有所不理解:char* ptr = new char[10]的时候写入17个字符至ptr,delete [] ptr并不会core;写入29个字符至ptr,delete [] ptr引发signal6 abort的core;对内存申请的头部和尾部数据保护还是没搞清楚。

时间: 2024-12-23 20:52:45

delete数组引发的core分析的相关文章

C++ 中数组做参数的分析

C++ 中数组做参数的分析 1.数组降价问题? "数组引用"以避免"数组降阶",数组降阶是个讨厌的事,这在C语言中是个无法解决的问题,先看一段代码,了解什么是"数组降阶" 1 #include <IOSTREAM> 2 using namespace std; 3 4 void Test( char array[20] ) 5 { 6 cout << sizeof(array) << endl; // 输出 4

MySql的Delete、Truncate、Drop分析

MySql的Delete.Truncate.Drop分析 相同点: truncate 和不带 where 子句的 delete,以及 drop 都会删除表内的数据 不同点 1. truncate 和 delete 只删除数据不删除表的结构(定义) drop 语句将删除表的结构被依赖的约束(constrain).触发器(trigger).索引(index);依赖于该表的存储过程/函数将保留,但是变为 invalid 状态. 2. delete 语句是数据库操作语言(dml),这操作会放到rollb

C语言中字符数组和字符串指针分析

这几天搞Unix上的C程序,里面用到了很多字符数组和字符串指针,我记得在学完C语言后相当一段时间里,对指针这个东西还是模模糊糊,后来工作也没怎么 用到过C,虽然网上这类的文章也有很多,还是决定自己在这做个小总结,也算加深下自己的印象,写了下面的测试程序: #include <stdio.h> int main(int argc, char *argv[]){ char day[15] = "abcdefghijklmn";  char* strTmp = "opq

63.如何对单链表进行快排?和数组快排的分析与对比[quicksort of array and linked list]

[本文链接] http://www.cnblogs.com/hellogiser/p/quick-sort-of-array-and-linked-list.html [题目] 单链表的特点是:单向.设头结点位head,则最后一个节点的next指向NULL.如果只知道头结点head,请问怎么将该链表排序? [分析] 对于数组的快排:有2种方式. (1)指针相向移动:一个指针i指向头,一个指针j指向尾,然后两个指针相向运动并按一定规律交换值,最后找到一个支点p使得支点左边的值小于支点,支点右边的值

“数组最大值求和2”分析报告

“数组最大值求和2”分析报告 一.设计思想 1.定义一个数组元素个数可变的数组,用宏定义实现(a[n]). 2.用rand函数产生正负随机数,存入数组中. 3.定义一个二维数组(b[n][n]),用来依次存放各个子数组的值. 4.找出二维数组中最大的值,就是最大的子数组的值. 5.二维数组中的最大值的下标,就分别是最大子数组的起始下标和结束下标,比如b[2][4]是二维数组中最大的值,即最大子数组的下标就是2.3.4. 二.开发过程(结组开发) 我主要负责程序分析,代码编程,之前的程序能够处理的

std::sort引发的core

#include <stdio.h> #include <vector> #include <algorithm> #include <new> struct foo_t { int size; }; class cmp_t { public: bool operator()(foo_t *a, foo_t *b) { return a->size >= b->size; } }; int main(int argc, char *argv

Select 使用不当引发的core,你应该知道的

排查一个死机问题,搞了好几天时间,最终确定原因:最终确定问题原因,在此分享一下: 第一步:常规根据core文件查看栈信息,gdb –c core xxxx 如下rip不正确,指令地址错乱,栈信息已破坏:在此基础上准确定位非常困难,但是仍可发现一些线索: 根据当前栈信息,大概寻找到怀疑的函数 查看整个栈上下信息,看有无怀疑的函数: 所以很有可能就是fetchNSAddrEv函数导致,需要重点关注: 更深入的细节,限于汇编不深入,比较难分析,不过可以有另外途径: 第二步:因为core是能复现出来,所

[Java] 数组声明有关问题分析

问题 最近在CSDN论坛上闲逛的时候,看见有朋友在询问一些基础的知识点,而恰好最近我一直在学Java基础部分,因此我从内存的角度试着总结了一下有数组声明有关问题 @Test public void Test(){ String[] p = null; p = {"no"};//这种不指定数组下标初始化的方式只在下一行这种格式中适用 String[] s = new String[]{"no"}; p[0] = "y";//此处编译可以通过,但是运

Javascript数组与字典用法分析

http://www.68idc.cn/help/makewebs/javascript/20141214142024.html 这篇文章主要介绍了Javascript数组与字典用法,以实例形式较为详细的分析了Array作为数组与字典的不同用法,具有一定的参考借鉴价值,需要的朋友可以参考下 本文实例分析了Javascript数组与字典用法.分享给大家供大家参考.具体分析如下: Javascript 的数组Array,既是一个数组,也是一个字典(Dictionary). 先举例看看数组的用法. 复