1

请看下面的代码。

游戏组件.h

#pragma once
#include<time.h>
#include "Position.h"

class GameComponent
{
public:
    GameComponent(int);
    GameComponent();
    ~GameComponent(void);

    virtual void update(const tm*);

    void addPosition(Position *p);

    friend class Position;

private:
    int id;
    Position *position;
};

游戏组件.cpp

#include "GameComponent.h"
#include <iostream>
#include <time.h>
#include "DrawableGameComponent.h"
#include "Position.h"

using namespace std;

GameComponent::GameComponent(int v):id(v)
{

}

GameComponent::GameComponent(){}


GameComponent::~GameComponent(void)
{

}

void GameComponent::update(const tm* time)
{
    cout << "ID : " << id << endl;
    cout << "Update: " << time->tm_hour << ":" << time->tm_min << ":" << time->tm_sec << endl;
    position->display();

    //Position::displayPositions();
}

void GameComponent::addPosition(Position *p)
{
    position = p;
    p->display();
    cout << "position working" << endl;
}

位置.h

#pragma once
class Position
{
    friend class GameComponent;
public:
    Position(int x, int y, int z);
    Position();
    ~Position();
    void display();

private:
    int x;
    int y;
    int z;
};

位置.cpp

#include "Position.h"
#include <iostream>

using namespace std;

Position::Position(int x, int y, int z)
{
    this->x = x;
    this->y = y;
    this->z = z;
}

Position::Position(){}


Position::~Position(void)
{
}

void Position::display()
{
    //cout << "Display Working" << endl;
    cout <<"Position " << " X: " << x << " Y: " << y << " Z: " << z << endl; 
}

首先,这不是完整的代码,这是发生错误的代码的一部分。当我运行我的代码时,我得到了错误

Unhandled exception at 0x00302d90 in GameEngine.exe: 0xC0000005: Access violation reading location 0xcdcdcdd5.

它指向方法的输出区域(cout << "X" << ........)display()positionVisual Studio 显示一个黄色数组指向那个地方)。

我用谷歌搜索了这个问题,发现这是因为空指针而发生的,它指向的地方没有。GameComponent的方法内部有一个指针分配(将指针参数分配给另一个指针)addPosition()

我相信错误来自那里。请帮我摆脱这个错误

更新

以下是我无法 addPosition() 的位置

测试.cpp

游戏组件**组件;

void Test::add(GameComponent *gameComponent, Position *p)
{

        component[componentCount] = gameComponent;
        component[componentCount]->addPosition(p);
        componentCount++;


}
4

1 回答 1

5

0xCDCDCDCD是 MSVC 在分配的内存周围放置的一个特殊值,用于在访问无效内存时提醒您(和调试运行时)。

由于您的地址高 0x08,我怀疑您正在添加到指针或数组并试图取消引用它。这可能是一个错误,试图抓取超出数组末尾的项目,或者它可能是释放后正在使用的对象。

我用谷歌搜索了这个问题,发现这是因为空指针而发生的,它指向的地方没有。GameComponent 的 addPosition() 方法内部有一个指针分配(将指针参数分配给另一个指针)。

检查以确保该指针有效并且不是0xCDCDCDCD或指向填充了该(或其他保护)值的内存。如果编译器正在填充Position或插入 vtable 引用,则 segfault 中给出的地址与X取消引用时的位置匹配0xCDCDCDCD

于 2012-12-21T17:03:20.727 回答