我是计算机编码领域的新手,所以我不确定如何读取GDP,但是遇到了Seg Fault:11,它试图在程序中运行我的设置器。谁能解释为什么这些设置者会引起问题(如果可能的话,用拉明和技术术语来解释)?设置器的编码如下:
class MapEntry{
private:
int mIDVal;
char* mKeyName;
public:
MapEntry(char *key, int val) {
mKeyName = key;
mIDVal = val;
}
int getVal(){
return mIDVal;
}
char* getKey(){
return mKeyName;
}
void setVal(int val){
this->mIDVal = val;
}
void setKey(char* key){
this->mKeyName = key;
}
};
我正在尝试创建一个简单的数据库,该数据库具有一个char字符串作为键,而一个学生ID则作为val。这是其余的代码。
Map::Map() {
database = new MapEntry*[DATABASE_SIZE];
for (int i = 0; i < DATABASE_SIZE; i++){
database[i]->setVal(0);
database[i]->setKey("");
}
}
/* Adds (inserts) val with the associated key.
* Returns if successful or not. (It is not successful if we are out of
* memory, or if the key already exists.)
*/
bool Map::add(const char *key, int val) {
char lettersForKey[50];
strcpy(lettersForKey, key); //because const ref and all that jazz
// when adding, I need to make sure the key does not already exist
for (int i = 0; i < DATABASE_SIZE; i++)
if (database[i]->getVal() == 0) {
database[i]->setVal(val);
database[i]->setKey(lettersForKey);
}
return false;
}
void Map::print() {
for (int i = 0; i < DATABASE_SIZE; i++)
if (database[i] != NULL) {
std::cout << database[i]->getKey() << " " << database[i]->getVal() << "\n";
}
}
最佳答案
错误是因为您尚未创建任何MapEntry
对象。
此行创建一个MapEntry指针数组,但是指针尚未初始化。
database = new MapEntry*[DATABASE_SIZE];
您还需要创建
MapEntry
对象,也许像这样for (int i = 0; i < DATABASE_SIZE; i++){
database[i] = new MapEntry();
database[i]->setVal(0);
database[i]->setKey("");
}
}
当然,可以通过避免使用指针来避免所有麻烦,您知道它们是不好的吗?
class Map
{
std::vector<MapEntry> database;
};
Map::Map() : database(DATABASE_SIZE)
{
for (int i = 0; i < DATABASE_SIZE; i++)
{
database[i].setVal(0);
database[i].setKey("");
}
}
没有指针,没有问题。您也应该用
char* mKeyName
替换MapEntry
中的std::string mKeyName
指针。关于c++ - 造成赛段错误的二传手,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48775549/