指针问题 - 获取访问冲突

时间:2014-07-24 17:14:07

标签: c++ variables pointers memory-management scope

我无法理解使用指针分配内存的方式。我正在创建几个“嵌套”结构,因为我在访问这些结构时需要几个不同的复杂层...这是代码:

struct HTCoord
{
    float Position[3];

    void DebugDisplay()
    {
        std::cout << "HTCoord:" << Position[0] << ", " << Position[1] << ", " << Position[2] << " ";
    }
};

struct HTColor
{
    float Color[4];

    void DebugDisplay()
    {
        std::cout << "HTColor: " << Color[0] << ", " << Color[1] << ", " << Color[2] << ", " << Color[3] << " ";
    }
};

struct HTVertex
{
    HTCoord Position;
    HTColor Color;

    void DebugDisplay()
    {
        Position.DebugDisplay();
        Color.DebugDisplay();           
    }
};

struct HTLblVertex
{
    UINT ID;
    HTVertex *pVertex;

    void DebugDisplay()
    {
        std::cout << "ID: " << ID << " ";
        pVertex->DebugDisplay();
        std::cout << "\r\n";
    }
};

class TestCube
{
    UVFace *Faces[6];
    HTLblVertex Vertices[8];
    HTVertex VertRefs[8];


public:
    TestCube()
    {
        HTVertex TestVertices[8] = {
            { 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f }, //0
            { 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f }, //1
            { 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 1.0f }, //2
            { 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f }, //3
            { 1.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f }, //4
            { 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, 1.0f, 1.0f }, //5
            { 1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f }, //6
            { 1.0f, 1.0f, 1.0f, 0.2f, 0.2f, 0.2f, 1.0f }  //7
        };

        for (int i = 0; i < 8; i++)
        {
            VertRefs[i] = TestVertices[i];
            Vertices[i] = { i, &VertRefs[i] };  //the pointer resets to null after the constructor exits            
        }


    }
    ~TestCube()
    {
        for (int i = 0; i < 6; i++)
        {
            delete Faces[i];
        }
        delete Faces;
    }

    void DebugDisplay()
    {
        for (int i = 0; i < 6; i++)
        {
            std::cout << "FACE " << (i + 1)<< " ";
            Faces[i]->DebugDisplay();
        }
    }
};

在最终的类对象中,似乎出现了麻烦。变量“VertRefs”似乎保持不变并且处于正确的值,但指针“Vertices”数组似乎不再在离开构造函数并调用“DebugDisplay”后正确引用它们 - 它们都被设置为“null”或尝试阅读永远不会降落。为什么指针没有初始化? (显然我正在宣布它们是不正确的,并且不明白究竟发生了什么)。任何帮助将不胜感激 - 我最近一直在修补C ++而不是C#,它让我烦躁: - )

编辑:我删除了“UVFace”代码,因为这不是我问的问题,但指针仍有问题,每个人都对UVFace代码感到兴奋。

2 个答案:

答案 0 :(得分:4)

delete Faces绝对是导致内存访问冲突的原因。

此数组是静态分配的,不应动态解除分配。

答案 1 :(得分:0)

该问题似乎已得到解决。看起来这些指针实际上并没有对其自身进行去初始化,但是一旦代码块离开对象并返回,IDE就无法识别它们的值。原始内存访问问题与创建一些本机数组并将它们传递给&#34; UVFace有关。&#34;当本机阵列超出范围时,&#34; UVFace&#34;对象留下了悬空指针。

由于没有人回答,我以为我会暂时留下这个答案我会在Stack Overflow中发现我希望多年前得到回答的流浪问题。

对于试图将语言转换为C ++的人来说 - 我的问题的本质有两个方面:

第一个问题是指针不能保存对象,如果该对象在函数中具有作用域,除非该对象用&#34; new声明。&#34;对象超出范围,指针仍指向永不落地。

第二个问题是Visual Studio显然无法识别成员变量的指针指向的内容如果您离开成员函数并返回另一个可能错误导致的成员函数你可以通过在调试器中检查它来指出指针没有指向任何东西。

即。 Visual Studio(错误地)告诉我我的&​​#34; Vertices&#34;离开构造函数并返回后,指针数组为NULL。这让我相信我在连锁店的突破早于后来悬挂的指针。如果您习惯依赖调试器为您提供准确的信息(如果您习惯使用C#或VB),请参阅此问题以获取有关误导调试器信息的更多信息:Visual Studio not able to show the value of 'this' in release mode (with debug information)