我正在尝试创建一个可以渲染网格的路径跟踪器,但我在尝试构建一个简单的边界体积层次结构时遇到了问题,这将帮助我遍历网格并提高性能。但是我遇到了一个问题,每当我尝试递归地划分网格中的顶点(我猜最终构建了一个 bvh)时,它会导致内存泄漏并链接到一个 cpp 文件“new_scalar.cpp”,告诉我有堆栈溢出.
为了尝试解决这个问题,我创建了另一个项目,其中我有一个存储浮点指针 vector 的节点,每当我调用分区时,它都会创建两个新节点,每个节点都有一半的分割 vector ,这有点模拟递归 build bvh 的性质。然后我在尝试修复它时遇到了同样的问题,但我不明白为什么。
#include <iostream>
#include <vector>
#include <ctime>
#define print(x) std::cout << x << std::endl;
struct Node {
std::vector<float*> Numbers;
Node* LeftNode;
Node* RightNode;
void Partition() {
if (Numbers.size() > 4) {
// Find center
float min = HUGE_VALF;
float max = -HUGE_VALF;
for (int i = 0; i < Numbers.size(); i++) {
min = fmin(min, *Numbers[i]);
max = fmax(max, *Numbers[i]);
}
float center = (min + max) * 0.5f;
// Partitioning
LeftNode = new Node;
RightNode = new Node;
for (int i = 0; i < Numbers.size(); i++) {
if (*Numbers[i] < center) {
LeftNode->Numbers.push_back(Numbers[i]);
}
else {
RightNode->Numbers.push_back(Numbers[i]);
}
}
LeftNode->Partition();
RightNode->Partition();
}
}
};
struct Object {
Node* Root;
void BuildBVH(std::vector<float*> numbers) {
Root = new Node;
Root->Numbers = numbers;
Root->Partition();
}
};
int main()
{
srand(std::clock());
// Initialize vector
std::vector<float*> numbers;
for (int i = 0; i < 100000; i++) {
float* newNumber = new float;
*newNumber = ((float)(rand() % 1000000) / 1000000.0f) * 2.0f - 1.0f;
numbers.push_back(newNumber);
}
Object object;
object.BuildBVH(numbers);
}
最佳答案
在您的函数 Partition
中,您正在递归调用 Partition
:
LeftNode->Partition();
RightNode->Partition();
每当您在 C++ 中调用函数时,返回地址(和任何参数)都会被压入堆栈。 C++ 堆栈大小从几千字节到几兆字节不等,但并不是真正为深度递归而设计的。所以您不想递归调用 Partition
100,000 次。也许将其重构为一个循环?
关于c++ - 内存泄漏问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58710558/