带有小数组的 delete[] 上的 SIGTRAP

be-*_*rty 4 c++

我的 C++ OpenGL 程序中出现了一个奇怪的 SIGTRAP 错误。首先,使用 new[] 运算符创建一个浮点数组,如下所示:

std::vector<ObjFace> faces = readObjFile("sphere.obj");
vertexBufferSize = faces.size() * 24;
auto* vertexBuffer = new GLfloat[vertexBufferSize];
Run Code Online (Sandbox Code Playgroud)

然后,数组被填充如下:

    for (int i{ 0 }; i < faces.size(); ++i) {
        for (int j{ 0 }; j < 4; ++j) {
            vertexBuffer[i*24 + j*8] = faces[i].corners[j][0];
            vertexBuffer[i*24 + j*8 + 1] = faces[i].corners[j][1];
            vertexBuffer[i*24 + j*8 + 2] = faces[i].corners[j][2];
            vertexBuffer[i*24 + j*8 + 3] = 1.0f;
            vertexBuffer[i*24 + j*8 + 4] = (faces[i].normals[j][0] + 1) / 2;
            vertexBuffer[i*24 + j*8 + 5] = (faces[i].normals[j][1] + 1) / 2;
            vertexBuffer[i*24 + j*8 + 6] = (faces[i].normals[j][2] + 1) / 2;
            vertexBuffer[i*24 + j*8 + 7] = 1.0f;
        }
    }
Run Code Online (Sandbox Code Playgroud)

然后将其与glBufferData宏一起使用并随后删除:

glBufferData(GL_ARRAY_BUFFER, vertexBufferSize * sizeof(GLfloat), vertexBuffer, GL_STATIC_DRAW);

delete[] vertexBuffer;
vertexBuffer = nullptr;
Run Code Online (Sandbox Code Playgroud)

由于某种原因,程序有时会因 SIGTRAP 错误(调试模式)或退出代码 -1073740940 (0xC0000374)(常规执行)而崩溃。我还确保这vertexBuffer不是空指针。

仅当数组大小相对较小时才会出现此问题。对于更大的尺寸,它可以毫无问题地工作。为了让它在较小的尺寸上工作,我不能使用new[]and delete[]- 但它会在更大的数组上崩溃,因为它们占用了太多的空间。有人可以向我解释一下这是怎么回事吗?

use*_*751 5

您为每个面写入 32 个浮点数,但您似乎认为只写入了 24 个浮点数。您为每个面分配 24 个浮点数并向前跳过 24 个浮点数以到达下一个面,但实际上您在每个面写入 32 个浮点数,因为你为每个顶点写 8 个浮点数,每个面写 4 个顶点。所以你总是在数组末尾之后额外写入 8 个浮点数。