c++ - 内存泄漏问题

标签 c++ visual-c++ raytracing

我正在尝试创建一个可以渲染网格的路径跟踪器,但我在尝试构建一个简单的边界体积层次结构时遇到了问题,这将帮助我遍历网格并提高性能。但是我遇到了一个问题,每当我尝试递归地划分网格中的顶点(我猜最终构建了一个 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/

相关文章:

c++ - 如何为我的语言编写自己的 Windows 输入工具软件?

c++ - 在没有附加库的情况下在标准 C/C++ 中解析 XML

c++ - 最适合即时消息客户端的异步套接字模型?

c++ - 从旧的 Borland C++ 迁移到 Visual C++ Express

c++ - 编辑控件中的搜索图标与输入区域重叠

c++ - 射线平面相交怎么做?

java - 如何从传入 vector 和表面法线中找到折射 vector ?

c++ - Fstream 不保存文件中的最后一个单词,也不从文件中读取

c++ - 如何在 MSVC 中使用 ECPG

raytracing - 光线追踪中的快速、无堆栈 kd 树遍历,需要澄清