上学期研究碰撞检测用fcl就遇到过指针的问题,

2021-11-05 fcl collisiondata 的重复使用?重分配内存

这回用深度相机实时得到点云转换到fcl里面进行碰撞检测,建立的collisionobject 是指向已分配内存的指针

fcl::CollisionObjectd* pointobj = new fcl::CollisionObject<double>(pointgeometry,m_collision.pointtransform);

通过replace或者update对该object进行操作,fcl为了限制该object里面的数据不会溢出,已提示输入新的顶点数量需要与原来一致,不然就有可能内存溢出。

int BVHModel<BV>::beginReplaceModel()
{if(build_state != BVH_BUILD_STATE_PROCESSED){std::cerr << "BVH Error! Call beginReplaceModel() on a BVHModel that has no previous frame." << std::endl;return BVH_ERR_BUILD_EMPTY_PREVIOUS_FRAME;}if(prev_vertices){delete [] prev_vertices;prev_vertices = nullptr;}num_vertex_updated = 0;build_state = BVH_BUILD_STATE_REPLACE_BEGUN;return BVH_OK;
}//==============================================================================
template <typename BV>
int BVHModel<BV>::replaceVertex(const Vector3<S>& p)
{if(build_state != BVH_BUILD_STATE_REPLACE_BEGUN){std::cerr << "BVH Warning! Call replaceVertex() in a wrong order. replaceVertex() was ignored. Must do a beginReplaceModel() for initialization." << std::endl;return BVH_ERR_BUILD_OUT_OF_SEQUENCE;}vertices[num_vertex_updated] = p;num_vertex_updated++;return BVH_OK;
}//==============================================================================
template <typename BV>
int BVHModel<BV>::replaceTriangle(const Vector3<S>& p1, const Vector3<S>& p2, const Vector3<S>& p3)
{if(build_state != BVH_BUILD_STATE_REPLACE_BEGUN){std::cerr << "BVH Warning! Call replaceTriangle() in a wrong order. replaceTriangle() was ignored. Must do a beginReplaceModel() for initialization." << std::endl;return BVH_ERR_BUILD_OUT_OF_SEQUENCE;}vertices[num_vertex_updated] = p1; num_vertex_updated++;vertices[num_vertex_updated] = p2; num_vertex_updated++;vertices[num_vertex_updated] = p3; num_vertex_updated++;return BVH_OK;
}//==============================================================================
template <typename BV>
int BVHModel<BV>::replaceSubModel(const std::vector<Vector3<S>>& ps)
{if(build_state != BVH_BUILD_STATE_REPLACE_BEGUN){std::cerr << "BVH Warning! Call replaceSubModel() in a wrong order. replaceSubModel() was ignored. Must do a beginReplaceModel() for initialization." << std::endl;return BVH_ERR_BUILD_OUT_OF_SEQUENCE;}for(unsigned int i = 0; i < ps.size(); ++i){vertices[num_vertex_updated] = ps[i];num_vertex_updated++;}return BVH_OK;
}//==============================================================================
template <typename BV>
int BVHModel<BV>::endReplaceModel(bool refit, bool bottomup)
{if(build_state != BVH_BUILD_STATE_REPLACE_BEGUN){std::cerr << "BVH Warning! Call endReplaceModel() in a wrong order. endReplaceModel() was ignored. " << std::endl;return BVH_ERR_BUILD_OUT_OF_SEQUENCE;}if(num_vertex_updated != num_vertices){std::cerr << "BVH Error! The replaced model should have the same number of vertices as the old model." << std::endl;return BVH_ERR_INCORRECT_DATA;}if(refit)  // refit, do not change BVH structure{refitTree(bottomup);}else // reconstruct bvh tree based on current frame data{buildTree();}build_state = BVH_BUILD_STATE_PROCESSED;return BVH_OK;
}

但是深度相机的有效点云中点的数量每次并不一致,因此需要重新开辟一块内存建立geom 数据结构来保存新的点云碰撞模型即可解决问题。

            /* update obj ? error about memory allocation   */fcl::CollisionObjectd* pointobj = new fcl::CollisionObject<double>(pointgeometry,m_collision.pointtransform);m_collision.pointobj = pointobj;

m_collision 类里面的pointobj 指针每次更新指向新的内存区域即可。

2022-3-12 fcl库的内存分配相关推荐

  1. 利用TCMalloc替换Nginx和Redis默认glibc库的malloc内存分配

    TCMalloc的全称为Thread-Caching Malloc,是谷歌开发的开源工具google-perftools中的一个成员.与标准的glibc库的Malloc相比,TCMalloc库在内存分 ...

  2. buddy内存分配算法

    1 普通内存分配方式的缺点以及解决方法: 1.1 普通的动态内存分配方式(如c语言运行库的内存分配malloc.free): 分配时,是在堆的空闲链表上,查找到第一块空闲的并且足够大的内存,然后对这块 ...

  3. 12.JDK1.8 JVM运行时数据区域概览、各区域介绍、程序计数器、Java虚拟机栈、本地方法栈、堆、堆空间内存分配(默认情况下)、字符串常量池、元数据区、jvm参数配置

    12.JDK1.8 JVM运行时数据区域概览 12.1.JDK1.8 JVM运行时数据区域概览 12.2.各区域介绍 12.3.各区域介绍 12.3.1.程序计数器 12.3.2.Java虚拟机栈 1 ...

  4. malloc,colloc,realloc内存分配,动态库,静态库的生成与调用

     1.在main方法里面直接定义一个非常大的数组的时候,可能会出现栈溢出:错误代码演示: #include<stdio.h> #include<stdlib.h> void ...

  5. 第12章类和动态内存分配

    第12章类和动态内存分配 (1) class student {char name[40];//并不是每一个字符串都是40//如果是一个对象数组,则浪费空间 }; 12.1 (1)静态成员在类声明中声 ...

  6. python内存分配失败_关于python:如何避免[Errno 12]无法分配使用子进程模块导致的内存错误...

    完整的工作测试案例 当然,根据您在本地和远程计算机上的内存,您的阵列大小会有所不同. z1 = numpy.random.rand(300000000,2); for i in range(1000) ...

  7. 2022年12月各大学网络教育统考大学英语B考试题库及时间

    自2022年起,网络教育考试委员会已经不再组织网络教育全国统一考试,网络教育统考已由各高校自行组织,在考试频次上,各高校均可按照实际情况进行,部分高校已将网络教育统考改为一年两次,部分学校改为三次,还 ...

  8. 2022年12月大学英语B统考题库试题

    2022年第三次统考时间预计在12月举行完毕,2022年12月奥鹏网络教育统考已有不少院校相继出通知,以下节选了部分高校网络教育统考时间节点以表格的形式展示给大家,例如:2022年西南大学网络教育统考 ...

  9. 第12章-cpp类和动态内存分配

    本章内容包括: • 对类成员使用动态内存分配. • 隐式和显式复制构造函数. • 隐式和显式重载赋值运算符. • 在构造函数中使用new所必须完成的工作. • 使用静态类成员. • 将定位new运算符 ...

最新文章

  1. AI一分钟 | 谷歌员工对中国版搜索引擎提出抗议;华为麒麟980将于本月底发布...
  2. 贪心入门——出租车费
  3. linux 删除文件命令_Linux系统常用的文件管理命令
  4. centos7: ifconfig出现command not found解决办法
  5. android cmake 打印_Android使用CMAKE编译libjpeg
  6. FastJson PropertyNamingStrategy 转换成JSON字符串的四种格式配置及源码解析
  7. jquery.tablesorter
  8. 对称加密和非对称加密的理解
  9. 2018 年React 将独占前端框架鳌头
  10. EXPRESS语言与IFC体系
  11. 在Wireshark的tcptrace图中看清TCP拥塞控制算法的细节(CUBIC/BBR算法为例)
  12. 转:__stack_chk_fail栈检查失败
  13. 微型计算机的英文术语,计算机常见英语词汇解释
  14. JavaScript (一) js的介绍及基本语法变量
  15. 【TeXstudio】【7】段落,编号与自定义编号——《LaTeX入门》
  16. Java中IO流-18-flush和close方法的区别
  17. Word删除空白页方法汇总
  18. 北京 上海 天津 河北 融资性担保机构经营许可证
  19. (二)Tushare Pro教程:上市公司财务数据接口
  20. wpsoffice安卓历史版本_WPS Office

热门文章

  1. Linux系统下安装PGI,OpenACC编译器
  2. 阿里云服务器CentOS
  3. 递归神经网络 matlab,机器学习系列:递归神经网络
  4. python批量打印网页_用Python批量打印定制的HTML页面
  5. 面试智力题:海盗分珍珠
  6. 化工热力学(第三版)课后答案完整版-朱
  7. 解压版MySQL安装与卸载教程
  8. 论语之雍也第六、述而第七
  9. INTELAMD性能天梯图
  10. VASP输入INCAR文件