小心陷阱:二维动态内存的不连续性
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
小心陷阱:二维动态内存的不连续性相关推荐
- c语言动态申请函数,C语言用malloc函数申请二维动态数组
C语言在程序运行中动态的申请及释放内存十分方便,一维数组的申请及释放比较简单. Sample one #include int main() { char * p=(char *)malloc(siz ...
- c语言malloc用法 数组,详解C语言用malloc函数申请二维动态数组的实例
详解C语言用malloc函数申请二维动态数组的实例 C语言在程序运行中动态的申请及释放内存十分方便,一维数组的申请及释放比较简单. Sample one #include int main() { c ...
- 【C 语言】数组 ( 验证二维数组内存是线性的 | 打印二维数组 | 以一维数组方式打印二维数组 | 打印二维数组值和地址 )
文章目录 一.验证二维数组内存是线性的 1.打印二维数组 2.以一维数组方式打印二维数组 3.打印二维数组值和地址 二.完整代码示例 一.验证二维数组内存是线性的 验证二维数组内存是线性的 : 验证方 ...
- 【C 语言】二级指针作为输入 ( 自定义二级指针内存 | 为 二级指针 分配内存 - 存放 一维指针 | 为每个 一级指针 分配内存 | 释放二维指针内存 )
文章目录 一.二级指针 1.为 二维指针 分配内存 2.为每个 一维指针 分配内存 3.释放 二维指针 内存 二.完整代码示例 一.二级指针 声明二级指针 : // 声明二维指针char **p = ...
- 【C 语言】二级指针作为输入 ( 二维数组 | 二维数组内存大小计算 | 指针跳转步长问题 )
文章目录 一.二维数组内存大小计算 二.二维数组内存大小意义 一.二维数组内存大小计算 给定一个二维数组 : 该 二维数组 中有 444 个 一维数组 , 每个一维数组有 101010 个 char ...
- cuda二维数组内存分配和数据拷贝
uda二维数组内存分配和数据拷贝 2016-04-20 10:54 138人阅读 评论(0) 收藏 举报 分类: 机器学习(11) 人工智能(9) 版权声明:本文为博主原创文章,允许转载. 因为cud ...
- 关于两个用于创建和销毁二维动态数组的宏
两个宏,用来创建和销毁二维动态数组的: #define matrix_allocate(matrix,width,height,TYPE) {\ matrix=new TYPE *[height]; ...
- 如何写一个魔方二维动态还原MATLAB仿真程序
之前文章写过一个魔方二维动态还原MATLAB程序,写得不怎么好,过于复杂,现在重新写了一个,用简单的方法编写MATLAB程序. 1.基础知识 了解魔方表示方法:魔方状态字符串,可以看我之前的文章. 了 ...
- 自动驾驶 4-3 二维动态建模Dynamic Modeling in 2D
sprung mass: [车辆] 簧上质量 spring: 弹簧 damper: [车辆] 减震器 unsprung mass: 非簧载质量 tire: 轮胎 vehicle shock absor ...
最新文章
- Linux下数值计算
- NOIP2018初赛提高组复习提纲(By HGOI LJC)
- 取代C语言的标准输入输出:cin 和 cout【C++标准输入输出】
- 九十一、动态规划系列 背包问题之混合背包
- docker tomcat 多开 实例_Docker zabbix-agent 监控 docker tomcat 多实例
- 操作系统:Win10系统下LocalNow和Roaming文件夹介绍
- 别人家的公司!雷军发红包 人均39万
- 【报告分享】2020年上半年中国直播电商行业发展分析报告.pdf(附下载链接)...
- 单片机加减法计算器_单片机简易加法计算器程序
- 浅谈Java两种并发类型——计算密集型与IO密集型
- 快递物流配货发货系统学习--以京东物流为例
- 传统建材采购的痛点有哪些?
- F(x) - NU ABO 韩中(繁)ass字幕
- 极致体验,解密微信背后的音视频通话技术
- ONF组织的SDN架构文档——四个架构(三/一)
- 商务礼仪的6大准则(转)
- request.getSession().setAttribute()和 request.setAttribute()
- AVX-512指令的前世今生
- 博彩游戏(tyvj 1519)
- 入门电机系列之3舵机