访问违规读取位置 0xCCCCCCCC.using bool & unsigned short

Access violation reading location 0xCCCCCCCC.using bool & unsigned short

本文关键字:bool unsigned short using 0xCCCCCCCC 读取 位置 访问      更新时间:2023-10-16

所以我试图整齐地设置我的代码,做我通常做的事情,但现在我在运行时收到此错误

First-chance exception at 0x01313D46 in Server.exe: 0xC0000005: Access violation reading location 0xCCCCCCCC.

Visual studio还在局部变量框中告诉我,它无法读取内存

unsigned short port
bool listening

这是发生错误的标头和 Cpp

#pragma once
#include <SFMLNetwork.hpp>
#include <iostream>
using namespace std;
class NetServer
{
private:
    bool listening;
    unsigned short port;
public:
    NetServer(void);
    ~NetServer(void);
    void InitNetServer();
    void SetListening(bool a)
    {
        a = listening;
    }
    bool IsListening()
    {
        return listening;
    }
    void SetPort(unsigned short a)
    {
        a = port;
    }
    int GetPort()
    {
        return port;
    }
};
调试在太

SetListening(bool a) 时中断,然后如果我把它拿出来,它会在 SetPort 中断

这是我的CPP

#include "NetServer.h"
sf::TcpListener listener;
sf::TcpSocket client;
NetServer::NetServer(void)
{
    //listener.listen(21025);
    //cout << "listening" << endl;
    while (true)
    {
        if (listener.accept(client) == sf::Socket::Done)
        {
            cout << "New connection received from " << client.getRemoteAddress() << endl;
        }
    }
}
NetServer::~NetServer(void)
{
    SetPort(NULL);
    SetListening(false);
}
void NetServer::InitNetServer()
{
    cout << "Initialising the NetServer" << endl;
    SetListening(true);
    SetPort(45000);
    listener.listen(GetPort());
    cout << "NetServer Initialised : Listening on Port "<< GetPort() << endl;
}

这是我唯一的另一个类,它也在GameServer.h/cpp中调用。

    #include "GameServer.h"
GameServer::GameServer()
{
    Run();
}
GameServer::~GameServer(void)
{
    DestroyNetServer();
    Exit();
}
void GameServer::Run()
{
    cout << "Initialising the engine." << endl;
    /* Initialise stuff here */
    _NetServer->InitNetServer();
    /* Finish initialisation */
    SetGameRunning(true);
    while(GetGameRunning() == true)
    {
        _NetServer;
    }
}
void GameServer::Exit()
{
    exit(0);
}
NetServer & GameServer::GetNetServer()
{
    if(_NetServer == 0) throw exception ("Null Game Server");
    return *_NetServer;
}
void GameServer::CreateNetServer()
{
    _NetServer = new NetServer();
}
void GameServer::DestroyNetServer()
{
    delete _NetServer;
}


#pragma once
#include "NetServer.h"
#include <iostream>
using namespace std;
class NetServer;
class GameServer
{
public:
    GameServer();
    ~GameServer(void);
    void Run();
    void Exit();
    void SetGameRunning(bool running)
    {
        gameRunning = running;
    }
    bool GetGameRunning()
    {
        return gameRunning;
    }
    void CreateNetServer();
    NetServer & GetNetServer();
    void DestroyNetServer();
private:
    bool gameRunning;
    NetServer * _NetServer;
};

Run 在构造函数中调用,没有人初始化_NetServer指针。因此,您正在尝试调用未启动对象的方法。在调用 Run() 之前添加 CreateNetServer

GameServer::GameServer()
{
  CreateNetServer()
  Run();
}

看起来你从不初始化listeningport。甚至您的 setter 方法也无济于事,因为赋值是翻转的(您正在将值分配给本地参数,而不是将值复制到您的实例成员)。

例如:

void SetListening(bool a)
{
    a = listening;
}

应该是:

void SetListening(bool a)
{
    listening = a;
}

除了修复 setter 之外,要解决从不分配 listeningport 值的问题,您需要在构造函数初始化列表中执行此操作:

NetServer::NetServer(void)
  : listening(false)
  , port(0)
{
    //listener.listen(21025);
    //cout << "listening" << endl;
    while (true)
    {
        if (listener.accept(client) == sf::Socket::Done)
        {
            cout << "New connection received from " << client.getRemoteAddress() << endl;
        }
    }
}

另外,我不知道这段代码的意图是什么,但它看起来是错误的:

while(GetGameRunning() == true)
{
    _NetServer;
}