博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
小心陷阱:二维动态内存的不连续性
阅读量:6359 次
发布时间:2019-06-23

本文共 1197 字,大约阅读时间需要 3 分钟。

void new_test(){    int** pp;    pp = new int*[10];    for(int i=0; i<10; ++i)    {        pp[i] = new int[10];    }    //pp[0], pp[1], ... , pp[9]在内存中连续;    //a1 = pp[0][0], pp[0][1], ... , pp[0][9]在内存中也是连续的;    //a2 = pp[1][0], pp[1][1], ... , pp[1][9]在内存中也是连续的;    //...    //a9 = pp[9][0], pp[9][1], ... , pp[9][9]在内存中也是连续的;    //然而 pp[0][9]与pp[1][0]是不连续的,pp[1][9]与pp[2][0]也不连续;    //即用new申请的动态堆内存,一维连续二维不连续;    //若从内存地址&(pp[0][0])连续写入10*10个int型数据则内存将会被破坏,然而这种破坏;    //是合法的,编译器不会出警告或错误,但程序运行中会出现非常诡异的现象;    //如某个变量突然莫名其妙的被改掉了,然而程序中并没有在任何地方改了它;}

 以上为简化代码,下面为程序中实际遇到的情况:

void CXAnimation::_loadAnimFromFile(cchar* pfile){    std::ifstream ifs(pfile, std::ios::binary);    if(!ifs || !ifs.is_open())return;    int num[2], i, iSet = 0, ii = sizeof(int);    while(!ifs.eof())    {        ifs.read((char*)num, ii*2); //num[0] 帧数, num[1] 骨骼数;        CXAnimSet animSet;        m_animSets.push_back(animSet);        CXAnimSet& rset = m_animSets[iSet];        rset.nFrame = num[0];        rset.pAnims = new float4x4*[num[0]];        m_nBones = num[1];//骨骼数总是不变的;        m_nb1 = num[1];        int nbt = num[1]*16*ii;        for(i=0; i

 

转载于:https://www.cnblogs.com/kingqi119/archive/2013/05/07/3065966.html

你可能感兴趣的文章
又一个 iOS 侧边栏组件: SideMenu
查看>>
vue.js 打包遇到的问题
查看>>
【译】更优秀的GraphQL官方中文文档-客户端如何使用
查看>>
git pull遇到的问题
查看>>
eclipse下maven spring项目环境配置
查看>>
无缝轮播
查看>>
CTS失败项分析(2)android.telephony.cts.VisualVoicemailServiceTest#testFilter_data
查看>>
三分钟,轻松了解Dapp
查看>>
GMQ交易平台满足不同客户群体的多种投资需求
查看>>
大数据开发如何入门你必须知道这些
查看>>
关于js(es5)如何优雅地创建对象
查看>>
阿里云前端周刊 - 第 28 期
查看>>
iOS 主队列同步造成死锁的原因
查看>>
es6 下比较对象是否有修改的简要方法
查看>>
windows安装mysql
查看>>
你还在看《深入理解Java虚拟机》的运行时数据模型吗?
查看>>
RIS,创建 React 应用的新选择
查看>>
线性结构上的动态规划--算法竞赛入门经典笔记
查看>>
面试官:你使用webpack时手写过loader,分离过模块吗?
查看>>
Ubuntu 16.04系统下 对OpenJDK编译好的Hotspot 进行调试
查看>>