社区首页 >问答首页 >C++:光线跟踪器导致内存不足错误--由于重复调用'new'?

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

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

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

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

代码语言:javascript
代码运行次数:0
复制
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
代码运行次数:0
复制
Color kaToAdd(kar, kag, kab);

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

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

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

https://stackoverflow.com/questions/29129725

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文