1

次のコードを見てください。

GameComponent.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;
};

GameComponent.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.

display()メソッドの出力領域 (cout << "X" << ........) をposition指しています (Visual Studio では、その場所を指す黄色の配列が表示されます)。

この問題をグーグルで調べたところ、どこにも指していないヌルポインターが原因で発生することがわかりました。GameComponentaddPosition()メソッド内にポインタ代入(別のポインタへのポインタパラメータの代入)があります。

エラーはそこから来ていると思います。このエラーを取り除くのを手伝ってください

アップデート

以下は、 addPosition() ができない場所です

テスト.cpp

GameComponent **コンポーネント;

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

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


}
4

1 に答える 1

5

0xCDCDCDCDは、無効なメモリがアクセスされたときにユーザー (およびデバッグ ランタイム) に警告するために、MSVC によって割り当てられたメモリの周りに配置される特別な値です。

あなたのアドレスは 0x08 高いので、ポインターまたは配列に追加して逆参照しようとしていると思われます。これは、配列の末尾を超えて項目を取得しようとした場合の 1 つずれのエラーである可能性があります。または、割り当て解除後に使用されているオブジェクトである可能性があります。

この問題をグーグルで調べたところ、どこにも指していないヌルポインターが原因で発生することがわかりました。GameComponent の addPosition() メソッド内に、ポインターの割り当て (別のポインターへのポインター パラメーターの割り当て) があります。

0xCDCDCDCDこのポインターが有効であり、その (または他のガード) 値で満たされたメモリを指していないか、指していないことを確認してください。コンパイラがPositionvtable 参照をパディングまたは挿入している場合、segfault で指定されたアドレスは、X参照解除時の場所と一致し0xCDCDCDCDます。

于 2012-12-21T17:03:20.727 に答える