【问题标题】:C++: Ray Tracer causing out of memory errors -- due to repeated calls to 'new'?C++:Ray Tracer 导致内存不足错误——由于重复调用“new”?
【发布时间】:2015-03-19 02:50:29
【问题描述】:

这是一个相当广泛的问题,所以我希望它符合 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*>listOfPrimitives;)

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

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

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

【问题讨论】:

  • 我假设您在某些时候调用 delete 来释放这些内存。您运行 32/64 位的操作系统是什么?可执行文件是 32/64 位的吗?您可以提供任何其他信息吗?
  • 可能你把它们都泄露了?
  • 显然我不会删除 Color 指针、BRDFCoefficients 指针和 Material 指针,我应该这样做。但是,由于我在上面发布的评论,这真的是我的程序崩溃的原因吗?
  • @RyanYu:你说你遇到了内存耗尽错误。而且,是的,当然,如果您不释放资源,您将耗尽内存。所以这就是你的程序崩溃的原因......
  • 不要像这样使用new。这不是 Java。

标签: c++ raytracing


【解决方案1】:

特别是对 new 的重复调用?

是的!

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

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

Color kaToAdd(kar, kag, kab);

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

如果你知道你需要动态分配,那很好,但是当你用完这些资源时,一定要delete,最好是通过std::unique_ptr这样的包装器。

【讨论】:

    猜你喜欢
    • 2017-09-06
    • 2011-05-12
    • 2022-06-12
    • 2018-11-10
    • 2011-05-05
    • 2017-03-15
    • 2014-04-15
    • 1970-01-01
    • 2011-04-29
    相关资源
    最近更新 更多