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<num[0]; ++i){rset.pAnims[i] = new float4x4[num[1]];xeAssert(rset.pAnims[i] != NULL);ifs.read((char*)&(rset.pAnims[i][0]), nbt);}//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@//特别注意: 下面这行代码是错误的,因为二维动态内存是不连续的;//所以下面的代码将导致内存不可预见的更改,比如m_nBones被莫名其妙的改掉了;//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ //ifs.read((char*)&(rset.pAnims[0][0]), num[0]*num[1]*16*ii);
iSet++;ifs.peek();}//计算骨骼初始变换的逆,方便蒙皮计算时使用,不必每一帧都做重复的运算;
    _calcInitInversTM();}

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

小心陷阱:二维动态内存的不连续性相关推荐

  1. c语言动态申请函数,C语言用malloc函数申请二维动态数组

    C语言在程序运行中动态的申请及释放内存十分方便,一维数组的申请及释放比较简单. Sample one #include int main() { char * p=(char *)malloc(siz ...

  2. c语言malloc用法 数组,详解C语言用malloc函数申请二维动态数组的实例

    详解C语言用malloc函数申请二维动态数组的实例 C语言在程序运行中动态的申请及释放内存十分方便,一维数组的申请及释放比较简单. Sample one #include int main() { c ...

  3. 【C 语言】数组 ( 验证二维数组内存是线性的 | 打印二维数组 | 以一维数组方式打印二维数组 | 打印二维数组值和地址 )

    文章目录 一.验证二维数组内存是线性的 1.打印二维数组 2.以一维数组方式打印二维数组 3.打印二维数组值和地址 二.完整代码示例 一.验证二维数组内存是线性的 验证二维数组内存是线性的 : 验证方 ...

  4. 【C 语言】二级指针作为输入 ( 自定义二级指针内存 | 为 二级指针 分配内存 - 存放 一维指针 | 为每个 一级指针 分配内存 | 释放二维指针内存 )

    文章目录 一.二级指针 1.为 二维指针 分配内存 2.为每个 一维指针 分配内存 3.释放 二维指针 内存 二.完整代码示例 一.二级指针 声明二级指针 : // 声明二维指针char **p = ...

  5. 【C 语言】二级指针作为输入 ( 二维数组 | 二维数组内存大小计算 | 指针跳转步长问题 )

    文章目录 一.二维数组内存大小计算 二.二维数组内存大小意义 一.二维数组内存大小计算 给定一个二维数组 : 该 二维数组 中有 444 个 一维数组 , 每个一维数组有 101010 个 char ...

  6. cuda二维数组内存分配和数据拷贝

    uda二维数组内存分配和数据拷贝 2016-04-20 10:54 138人阅读 评论(0) 收藏 举报 分类: 机器学习(11) 人工智能(9) 版权声明:本文为博主原创文章,允许转载. 因为cud ...

  7. 关于两个用于创建和销毁二维动态数组的宏

    两个宏,用来创建和销毁二维动态数组的: #define matrix_allocate(matrix,width,height,TYPE) {\  matrix=new TYPE *[height]; ...

  8. 如何写一个魔方二维动态还原MATLAB仿真程序

    之前文章写过一个魔方二维动态还原MATLAB程序,写得不怎么好,过于复杂,现在重新写了一个,用简单的方法编写MATLAB程序. 1.基础知识 了解魔方表示方法:魔方状态字符串,可以看我之前的文章. 了 ...

  9. 自动驾驶 4-3 二维动态建模Dynamic Modeling in 2D

    sprung mass: [车辆] 簧上质量 spring: 弹簧 damper: [车辆] 减震器 unsprung mass: 非簧载质量 tire: 轮胎 vehicle shock absor ...

最新文章

  1. Linux下数值计算
  2. NOIP2018初赛提高组复习提纲(By HGOI LJC)
  3. 取代C语言的标准输入输出:cin 和 cout【C++标准输入输出】
  4. 九十一、动态规划系列 背包问题之混合背包
  5. docker tomcat 多开 实例_Docker zabbix-agent 监控 docker tomcat 多实例
  6. 操作系统:Win10系统下LocalNow和Roaming文件夹介绍
  7. 别人家的公司!雷军发红包 人均39万
  8. 【报告分享】2020年上半年中国直播电商行业发展分析报告.pdf(附下载链接)...
  9. 单片机加减法计算器_单片机简易加法计算器程序
  10. 浅谈Java两种并发类型——计算密集型与IO密集型
  11. 快递物流配货发货系统学习--以京东物流为例
  12. 传统建材采购的痛点有哪些?
  13. F(x) - NU ABO 韩中(繁)ass字幕
  14. 极致体验,解密微信背后的音视频通话技术
  15. ONF组织的SDN架构文档——四个架构(三/一)
  16. 商务礼仪的6大准则(转)
  17. request.getSession().setAttribute()和 request.setAttribute()
  18. AVX-512指令的前世今生
  19. 博彩游戏(tyvj 1519)
  20. 入门电机系列之3舵机

热门文章

  1. flashcom中远程共享对象SharedObject的用法
  2. 用“脸”打卡,抬头就能签到!
  3. 解决阿里云无法正常使用samba的问题【转】
  4. 向下滚动页面导航悬浮
  5. 可能是 nginx 限速最容易理解的说明
  6. define##的作用
  7. Openreach与华为/诺基亚签署G.fast协议
  8. Maven实战:Maven生命周期
  9. Exchange企业实战技巧(3)配置Exchange证书
  10. 随想_8_Windows_XP_Explorer_错误