Loading [MathJax]/jax/input/TeX/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >C++:光线跟踪器导致内存不足错误--由于重复调用'new'?

C++:光线跟踪器导致内存不足错误--由于重复调用'new'?
EN

Stack Overflow用户
提问于 2015-03-18 18:17:50
回答 1查看 127关注 0票数 0

这是一个相当宽泛的问题,所以我希望它大致符合S/O问题的指导方针。

基本上,我正在编写一个Ray Tracer,它从场景文件中获取输入。现在,对于场景文件中定义的每个新三角形/球体,我在C++中执行以下操作(希望代码是自解释的):

代码语言:javascript
运行
AI代码解释
复制
GeometricPrimitive* primitiveToAdd = new GeometricPrimitive();
Triangle* triangleToAdd = new Triangle(ax, ay, az, bx, by, bz, cx, cy, cz);
BRDFCoefficients *brdfToAdd = new BRDFCoefficients();
Color* kaToAdd = new Color(kar, kag, kab);
Color* kdToAdd = new Color(kdr, kdg, kdb);
Color* ksToAdd = new Color(ksr, ksg, ksb);
Color* krToAdd = new Color(krr, krg, krb);
brdfToAdd->ka = *kaToAdd;
brdfToAdd->kd = *kdToAdd;
brdfToAdd->ks = *ksToAdd;
brdfToAdd->kr = *krToAdd;
brdfToAdd->sp = ksp;
Material* materialToAdd = new Material();
materialToAdd->constantBRDF = *brdfToAdd;
primitiveToAdd->material = materialToAdd;
primitiveToAdd->shape = triangleToAdd;
aggregatePrimitive.addPrimitive(primitiveToAdd);

(aggregatePrimitive是一个具有std::vector<GeometricPrimitive*> listOfPrimitives的全局变量;)

光线跟踪器在小的例子上工作得很好,但是当我试图从.obj文件中启动一些更复杂的例子时,我的计算机运行了几分钟,然后得到一个内存不足的错误。我还启动了一个60GBRAM的EC2实例,并在该实例上运行光线跟踪器,但它仍然耗尽了内存。

一开始,我认为这只是因为光线跟踪器太慢,而且它确实占用了太多内存。但会不会是别的原因呢?特别是对new的重复调用?(我不太确定在这种情况下动态分配内存的确切后果是什么。)一个60GBRAM的EC2实例不能工作似乎有点可疑……

再一次,我意识到这是一个相当宽泛和不具体的问题,但是你有什么想法吗?

EN

回答 1

Stack Overflow用户

发布于 2015-03-18 18:50:29

特别是对

的重复调用?

是的!

您没有释放这些资源中的任何一个。

在我看来,你应该完全避免使用new。例如:

代码语言:javascript
运行
AI代码解释
复制
Color kaToAdd(kar, kag, kab);

当然,这里不需要动态分配。

如果你知道你需要动态分配,那很好,但是一定要在你使用完这些资源后对它们进行delete,最好是通过std::unique_ptr这样的包装器。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29129725

复制
相关文章
linux内存不足导致tomcat宕机
查看系统日志,显示内存不足,杀死了一个java进程,可以推测,就是tomcat惨遭了毒手,
全栈程序员站长
2022/09/15
3.3K0
由于外键约束问题导致ORA-00060错误,报Single resource deadlock
由于外键约束问题导致ORA-00060错误,报Single resource deadlock [TM]处理过程
PHP开发工程师
2021/05/14
5180
映射重复导致的错误:Ambiguous handler methods mapped for HTTP path
  出现Ambiguous Mapping异常时,找到同一请求路径映射到两个方法的地方,修改即可。使这两个方法有区分即可。注意:要一并修改对应的jsp上的请求路径。
黑泽君
2018/12/13
5.9K0
映射重复导致的错误:Ambiguous handler methods mapped for HTTP path
内存不足导致 nginx 崩溃的原因分析
最近在 Centos7 上搭建 nginx 作为 web 服务器使用,但是使用过程中,nginx 总是莫名其妙的崩掉,使用命令 dmesg 检查错误信息如下:
sylan215
2020/03/02
3.3K0
Metaspace内存不足导致FGC问题排查
清楚的记得是2020/7/25 14:34分左右,周六的下午,我还在公司苦逼的加班中,突然钉钉告警群里出现大量应用OP的dubbo超时调用、空指针异常,异常中间还有Metaspace元空间不足等异常:
LiosWong
2020/09/01
3.8K0
Metaspace内存不足导致FGC问题排查
由于不当的执行顺序导致的死锁
为了保证线程的安全,我们引入了加锁机制,但是如果不加限制的使用加锁,就有可能会导致顺序死锁(Lock-Ordering Deadlock)。
程序那些事
2020/07/08
4310
C++ 06 - new
关于c++中的new, 主要分为operator new 和 new operator.
Reck Zhang
2021/08/11
3570
C++的cin输入错误导致死循环
今天在写代码的时候遇到一个bug,也是在无意中发现的,当我乱输入的时候(乱敲键盘那种),程序会出现死循环。
花狗Fdog
2020/10/28
1.4K0
由于java.util.Arrays.asList(...)导致的异常
   Collections.toArray()与Arrays.asList() 是Java API提供的友好的相互转换工具,日常开发中用于列表和数组之间的转换非常方便,但今天测试时,发现一下隐藏的坑。。。
云海谷天
2022/08/09
2430
由于java.util.Arrays.asList(...)导致的异常
从零开始学C++之重载 operator new 和 operator delete 实现一个简单内存泄漏跟踪器
s1mba
2017/12/26
8930
从零开始学C++之重载 operator new 和 operator delete 实现一个简单内存泄漏跟踪器
在Mac上,解决由于环境变量错误,导致在终端上无法使用基本命令
此时此刻在当前终端窗口,就可以开心的用linux命令了,千万不要关了当前窗口(救急方案)
新人小试
2020/03/30
2.4K0
C++内存管理(new operator/operator new/operator delete/placement new)
我们平时使用的new是new操作符(new operator),就像sizeof一样是语言内置的,不能改变它的含义,功能也是一样的
WindSun
2019/09/02
1.6K0
C++内存管理(new operator/operator new/operator delete/placement new)
C++中的定位放置new(placement new)
一般来说,使用new申请空间时,是从系统的“堆”(heap)中分配空间。申请所得的空间的位置时根据当时的内存的实际使用情况决定的。但是,在某些特殊情况下,可能需要在程序员指定的特定内存创建对象,这就是所谓的“定位放置new”(placement new)操作。
恋喵大鲤鱼
2018/08/03
9770
由于版本依赖造成的YUM段错误
最近在服务器(Centos 5.3,64位)上使用YUM,总是提示 Segmentation Fault,无论执行什么命令都是如此,一时不得其解。
大江小浪
2018/07/25
1.4K0
MySQL ProxySql 由于漏洞扫描导致的 PROXYSQL CPU 超高
ProxySQL 本身是一款非常棒的MYSQL 中间件的开源产品, 在公司运行了一段时间后,突然一天报警,所在机器的CPU 出奇的高,之前在测试系统, 预生产, 以及生产系统均没有出现问题. 开始未来紧急解决问题,重新启动了proxysql服务,并查看错误日志.
AustinDatabases
2020/09/27
8720
MySQL  ProxySql   由于漏洞扫描导致的 PROXYSQL CPU 超高
内存不足导致Tomcat崩溃问题排查与解决办法
前言 今天,遇到一个内存不足的问题而导致服务崩塌的情况,特此记录一下333! 错误警告: Java HotSpot(TM) 64-Bit Server VM warning: INFO: os::c
Jensen_97
2023/08/09
1.4K0
内存不足导致Tomcat崩溃问题排查与解决办法
C++为啥要使用new
1.为什么要有new? 为什么要有new?为什么要动态创建对象?为什么有时候不用new,有时候又用new,比如: // Cocos2d-x3.x的Value类,大家都很熟悉了 Value v = Value(100); // Cocos2d-x的Sprite类,也很属性了 Sprite* sp = new Sprite(); 为什么有些地方不用new,有些地方又要new呢? 这就涉及到自动存储和动态存储了。 2.自动存储(自动变量、局部变量) 自动存储,也叫做自动变量,比如int num = 10; 这个
hbbliyong
2018/03/06
1.5K0
RTSP视频结构化智能分析平台EasyNVR由于多次输入错误密码导致登录锁定如何处理?
针对TSINGSEE青犀视频平台EasyNVR及其他平台,我们都设定了用户登录机制,比如我们的演示平台,非系统用户可以进行游客登录,只有用户名登录下才可对系统进行更改或者设置。因此也有用户在使用EasyNVR时,经常输错密码导致锁定。
EasyNVR
2021/04/19
8590
RTSP视频结构化智能分析平台EasyNVR由于多次输入错误密码导致登录锁定如何处理?
点击加载更多

相似问题

C++光线跟踪器错误

22

c++光线跟踪器:反射错误

121

光线跟踪器折射错误

11

光线跟踪器光反射错误

228

由于位图太大而导致内存不足错误

11
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档