塞特犬导致Segfault

0 c++ setter this segmentation-fault

我对计算机编码世界有点新意,所以我不确定如何阅读GDP,但是当我试图在我的程序中运行我的setter时,我得到了Seg Fault:11.任何人都可以解释为什么这些安装人员会引起问题(如果可能的话,还有lamens术语和技术术语)?setter的编码如下:

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;
    }
};
Run Code Online (Sandbox Code Playgroud)

我正在尝试创建一个简单的数据库,其中包含一个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";
        }
}
Run Code Online (Sandbox Code Playgroud)

joh*_*ohn 5

错误是因为您尚未创建任何MapEntry对象.

此行创建一个MapEntry 指针数组,但指针尚未初始化.

database = new MapEntry*[DATABASE_SIZE];
Run Code Online (Sandbox Code Playgroud)

你也需要创建MapEntry对象,也许就像这样

for (int i = 0; i < DATABASE_SIZE; i++){
    database[i] = new MapEntry();
    database[i]->setVal(0);
    database[i]->setKey("");
    }
}
Run Code Online (Sandbox Code Playgroud)

当然你可以通过避免指针避免所有麻烦,你知道它们是坏的吗?

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("");
    }
}
Run Code Online (Sandbox Code Playgroud)

没有指针,没有问题.此时应更换char* mKeyName指针MapEntrystd::string mKeyName过.

  • 或者更好的是,使`database`成为`MapEntry`*对象*而不是指针的数组. (3认同)