这是一个相当宽泛的问题,所以我希望它大致符合S/O问题的指导方针。
基本上,我正在编写一个Ray Tracer,它从场景文件中获取输入。现在,对于场景文件中定义的每个新三角形/球体,我在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文件中启动一些更复杂的例子时,我的计算机运行了几分钟,然后得到一个内存不足的错误。我还启动了一个60GBRAM的EC2实例,并在该实例上运行光线跟踪器,但它仍然耗尽了内存。
一开始,我认为这只是因为光线跟踪器太慢,而且它确实占用了太多内存。但会不会是别的原因呢?特别是对new的重复调用?(我不太确定在这种情况下动态分配内存的确切后果是什么。)一个60GBRAM的EC2实例不能工作似乎有点可疑……
再一次,我意识到这是一个相当宽泛和不具体的问题,但是你有什么想法吗?
发布于 2015-03-18 18:50:29
特别是对
的重复调用?
是的!
您没有释放这些资源中的任何一个。
在我看来,你应该完全避免使用new
。例如:
Color kaToAdd(kar, kag, kab);
当然,这里不需要动态分配。
如果你知道你需要动态分配,那很好,但是一定要在你使用完这些资源后对它们进行delete
,最好是通过std::unique_ptr
这样的包装器。
https://stackoverflow.com/questions/29129725
复制相似问题