gpt4 book ai didi

c++ - 为什么访问这个局部成员变量会引发异常?

转载 作者:行者123 更新时间:2023-11-28 00:31:01 25 4
gpt4 key购买 nike

我正在尝试编写一个程序,当函数 getNumberOfRooms()当它试图返回 numberOfRooms 变量(类中的私有(private)成员)的值时,将被调用并抛出异常。以前有没有人遇到过这样的问题或帮助过此类问题的人?如果有,您是如何解决的?

提前致谢

此处提供完整源代码:https://bitbucket.org/skutov/micropuzzle/

调用 getNumberOfRooms() 时抛出的异常:

Unhandled exception at 0x01354aa6 in MICROPUZZLE.exe: 0xC0000005: Access violation
reading location 0xccccccd0.

这些是有问题的函数(所有时间在类中引用变量)

ClassMap::ClassMap ()
{
numberOfRooms = 0;

// Get number of rooms in map.csv

/* Find number of entries in map.csv file */

numberOfRooms = number_of_lines;

// allocate memory for rooms array

/* loading data from file into array */
}
}

// self explanitory
int ClassMap::getNumberOfRooms()
{
// Exception occurs on this line when accessing the variable
return numberOfRooms;
}

int ClassMap::printRoomDescriptions ()
{
for(int j = this->getNumberOfRooms(); j > 0; j--)
{
cout << roomArray[j].getDescription();
}
return 0;
}

这是类头:

class ClassMap
{
private:
int currentLocation;
int numberOfRooms;
// pointer to array initialised in constructor
ClassRoom *roomArray;

public:
// Constructors and Destructors
ClassMap();
~ClassMap();

// Print description, events and directions for current room
std::string getCurrentRoom();

// Change currentLocation to neighbour of current room if possible
int moveRoom(char direction);


// self explanitory
int getNumberOfRooms();

// dump room descriptions to command line (debugging)
int printRoomDescriptions();

};

这是 ClassMap 的构造函数,它还初始化了 roomArray:

ClassMap::ClassMap ()
{
numberOfRooms = 0;

// Get number of rooms in map.csv

unsigned int number_of_lines = 0;
FILE *infile = fopen("map.csv", "r");
int ch;

while (EOF != (ch=getc(infile)))
if ('\n' == ch)
++number_of_lines;
fclose(infile);
numberOfRooms = number_of_lines;




// allocate memory for rooms array
roomArray = new ClassRoom[numberOfRooms+1];

// set starting room
int currentLocation = 1;

// load that shit up
{
// Holders for values read from file
int newRoomID = 0;
char newRoomDescription[79] = "";
int newRoomNorthNeighbour = 0;
int newRoomEastNeighbour = 0;
int newRoomSouthNeighbour = 0;
int newRoomWestNeighbour = 0;

// used for iterations
int i = 0;

// File stream for map.csv
std::ifstream mapFile;

// Crack that shit open
mapFile.open ("map.csv");

// Line buffer for parsing
std::string line;


// For each line in the map.csv file read in the values into variables declared above then run initialise function for each room to store values into array
while (std::getline(mapFile, line))
{
// re-init parameters

newRoomID = 0;
newRoomNorthNeighbour = 0;
newRoomEastNeighbour = 0;
newRoomSouthNeighbour = 0;
newRoomWestNeighbour = 0;
for(i = 0;i<79;i++)
{
newRoomDescription[i] = ' ';
}


int parameter = 0;

int paraStart = 0;
int paraEnd = 0;

std::string buffer;
std::istringstream iss(line);

for(parameter = 0; parameter <= 5; parameter++)
{
// Empty buffer from last iteration
buffer.clear();

// Find end of current parameter
paraEnd = line.find(',',paraStart+1);

switch (parameter)
{
case 0:
buffer = line.substr((paraStart),(paraEnd-paraStart));
newRoomID = atoi(buffer.c_str());
break;
case 1:
buffer = line.substr((paraStart+2),(line.find("\"",paraStart+2)-(paraStart+2)));
for(i = 0;i<(buffer.length());i++)
{
newRoomDescription[i] = buffer.c_str()[i];
}
//newRoomDescription
break;
case 2:
buffer = line.substr((paraStart+1),(paraEnd-paraStart));
newRoomNorthNeighbour = atoi(buffer.c_str());
break;
case 3:
buffer = line.substr((paraStart+1),(paraEnd-paraStart));
newRoomEastNeighbour = atoi(buffer.c_str());
break;
case 4:
buffer = line.substr((paraStart+1),(paraEnd-paraStart));
newRoomSouthNeighbour = atoi(buffer.c_str());
break;
case 5:
buffer = line.substr((paraStart+1),(paraEnd-paraStart));
newRoomWestNeighbour = atoi(buffer.c_str());
break;
} // switch

// Cycle paraEnd to paraStart
paraStart = paraEnd;

} // for parameters loop

// Init next room with data
new (&roomArray[newRoomID]) ClassRoom( newRoomNorthNeighbour,
newRoomEastNeighbour,
newRoomSouthNeighbour,
newRoomWestNeighbour,
newRoomDescription);

} // while !EOF
// Close the file because we're a good little program and we don't need that shit no more
mapFile.close();
}
}

最佳答案

这个问题的关键在于:

Access violation reading location 0xccccccd0

0xcccccccc 是在 Debug模式下使用的特殊值,用于表示已初始化的指针。 (请参阅 How to end up with a pointer to 0xCCCCCCCC)它在 Debug模式下设置为导致这种崩溃 - 这意味着您正在使用的指针尚未设置。正确设置指针后,错误就会消失。 (与 0xcccccccc 的细微差别是您尝试在该对象中访问的成员的偏移量。)

添加:

这是你的错误:

ClassRoom* roomArray = static_cast<ClassRoom*>( ::operator new ( sizeof ClassRoom * numberOfRooms ) );

这会创建一个本地 roomArray 变量,并隐藏成员变量。你真正想要的是:

roomArray = static_cast<ClassRoom*>( ::operator new ( sizeof ClassRoom * numberOfRooms ) );

或者更好的是:

roomArray = new ClassRoom[numberOfRooms];

关于c++ - 为什么访问这个局部成员变量会引发异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22931037/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com