我正在構建一個游戲,每次創建一個玩家時,我都需要將一個玩家存盤在一個動態陣列中。我構建了一小段代碼來嘗試它,segmentation fault當我嘗試delete在桌子上插入第三個玩家時,我得到了一個。我只是無法意識到為什么會發生這種情況:header檔案是:
#include <iostream>
#include <string>
#include <vector>
using namespace std;
class Player
{
private:
string PlayerName;
int PlayerScore;
public:
Player();
Player(string name, int s);
~Player() {};
string getPlayerName() {return PlayerName;}
int getPlayerScore() {return PlayerScore;}
void setPlayerName(string name){PlayerName = name;}
void setPlayerScore(int score){PlayerScore = score;}
};
class Game
{
private:
Player NewPlayer;
int NPlayers;
Player* PlayerList;
//vector <Player> PlayerList2;
public:
Game();
~Game();
void setNewPlayer(string, int);
void resizePlayerList();
void PrintList();
};
class檔案:
#include <iostream>
#include <string>
#include <cstring>
#include <memory>
#include "I.h"
using namespace std;
Player::Player()
{
PlayerName = "";
PlayerScore = 0;
}
Player::Player(string name, int s)
{
PlayerName = name;
PlayerScore = s;
}
Game::Game()
{
NPlayers = 0;
PlayerList = NULL;
};
Game::~Game() {};
void Game::setNewPlayer(string str, int scr)
{
NewPlayer = Player(str, scr);
resizePlayerList();
PrintList();
}
void Game::resizePlayerList() {
if(NewPlayer.getPlayerName() != "No Name")
{
int newSize = NPlayers 1;
Player* newArr = NULL;
newArr = new Player[newSize];
memcpy( newArr, PlayerList, NPlayers * sizeof(Player) );
NPlayers = newSize;
delete [] PlayerList;
PlayerList = newArr;
PlayerList[NPlayers-1] = NewPlayer;
}
}
void Game::PrintList()
{
Player player;
//cout << NPlayers << endl;
for(int i= 0; i < NPlayers; i )
{
player = PlayerList[i];
cout << player.getPlayerName() << " " << player.getPlayerScore() << endl;
}
}
main: _
#include <iostream>
#include <string>
#include "I.h"
using namespace std;
int main()
{
Game NewGame;
NewGame.setNewPlayer("Peter",20);
NewGame.setNewPlayer("Someone Someone",30);
NewGame.setNewPlayer("Someone else",40);
return 0;
}
uj5u.com熱心網友回復:
問題源于這里:
memcpy(newArr, PlayerList, NPlayers * sizeof(Player));
你不能以這種方式復制類,除非它們是Trivially Copyable(最初是說POD,但正如 Yksisarvinen 在評論中指出的那樣,memcpy并沒有那么嚴格)。您可以通過使用回圈復制資料來解決此問題:
for (int i = 0; i < NPlayers; i) {
newArr[i] = std::move(PlayerList[i]);
}
不過,更好的選擇是使用 a std::vector<Player>,那么整個 resize 函式可以簡化為:
void Game::resizePlayerList() {
if (NewPlayer.getPlayerName() != "No Name") {
PlayerList.push_back(std::move(NewPlayer));
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/460435.html
上一篇:C 11/17中std::atomic的間接和直接初始化。有什么區別?
下一篇:如何在C 中提取檔案中的數字?
