内存泄漏问题

Issue with memory leak

本文关键字:问题 泄漏 内存      更新时间:2023-10-16

我正在尝试创建一个可以渲染网格的路径跟踪器,但在尝试构建一个简单的边界体积层次时遇到了问题,这将帮助我遍历网格并提高性能。然而,我遇到了一个问题,每当我试图递归地划分网格中的顶点时(我想最终构建一个bvh(,它都会导致内存泄漏,并链接到一个cpp文件"new_scalar.cpp",告诉我存在堆栈溢出。

为了解决这个问题,我创建了另一个项目,其中我有一个存储浮点指针向量的节点,每当我调用分区时,它都会创建两个新节点,每个节点都有一半的分裂向量,这在某种程度上模拟了构建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++堆栈大小从几千字节到几兆字节不等,但并不是为深度递归而设计的。因此,您不希望递归调用Partition100000次。也许把它重构成一个循环?

您将100000个浮点推送到numbers,然后在这些浮点上调用Partition()Partition()一次又一次地调用双方的Partition()(直到Numbers小于4,这仍然需要一段时间(。您的递归次数太多,导致调用堆栈溢出。

旁注:停止像这样使用new