gpt4 book ai didi

C++:Ray Tracer 导致内存不足错误——由于重复调用 'new'?

转载 作者:行者123 更新时间:2023-11-28 02:30:33 26 4
gpt4 key购买 nike

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

基本上,我正在编写一个从场景文件获取输入的光线追踪器。现在,对于我的场景文件中定义的每个新三角形/球体,我在 C++ 中执行以下操作(希望代码不言自明):

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*>原语列表;)

光线追踪器在小示例上运行良好,但当我尝试从 .obj 文件启动一些更复杂的示例时,我的计算机运行了几分钟,然后出现内存不足错误。我还启动了一个 60GB RAM EC2 实例并在其上运行光线追踪器,但它仍然内存不足。

一开始我以为这只是因为光线追踪器太慢了,而且它确实占用了太多内存。但它会是别的东西吗?具体是对new的反复调用? (我不确定在这种情况下动态分配内存的确切后果是什么。)60GB RAM EC2 实例不起作用似乎有点可疑......

同样,我意识到这是一个非常广泛且不具体的问题,但有什么想法吗?

最佳答案

Specifically the repeated calls to new?

是的!

您没有释放任何这些资源。

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

Color kaToAdd(kar, kag, kab);

这里肯定不需要动态分配。

如果您知道需要动态分配,那很好,但是一定要在用完这些资源后删除,最好是通过诸如std::unique_ptr

关于C++:Ray Tracer 导致内存不足错误——由于重复调用 'new'?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29129725/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com