首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Setters导致Segfault

Setters导致Segfault
EN

Stack Overflow用户
提问于 2018-02-14 05:00:09
回答 2查看 446关注 0票数 0

我在某种程度上是计算机编码领域的新手,所以我不太确定如何读取GDP,但当它试图在我的程序中运行我的setter时,我得到了Seg错误: 11。谁能解释一下为什么这些setter会引起问题(如果可能的话,都是用lamens术语和技术术语)?setters的编码如下:

代码语言:javascript
复制
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。下面是代码的其余部分。

代码语言:javascript
复制
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";
        }
}
EN

回答 2

Stack Overflow用户

发布于 2018-02-14 05:04:15

出现错误是因为您尚未创建任何MapEntry对象。

这一行创建了一个MapEntry指针数组,但是指针还没有初始化。

代码语言:javascript
复制
database = new MapEntry*[DATABASE_SIZE];

您还需要创建MapEntry对象,可能如下所示

代码语言:javascript
复制
for (int i = 0; i < DATABASE_SIZE; i++){
    database[i] = new MapEntry();
    database[i]->setVal(0);
    database[i]->setKey("");
    }
}

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

代码语言:javascript
复制
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("");
    }
}

没有指针,就没有问题。您也应该将MapEntry中的char* mKeyName指针替换为std::string mKeyName

票数 5
EN

Stack Overflow用户

发布于 2018-02-14 05:02:58

使用

代码语言:javascript
复制
database[i]->setKey(lettersForKey);

您可以使mKeyName成员指向数组的第一个元素,该数组是函数中的局部。一旦Map::add函数退出,该数组就会超出作用域(基本上不再存在),并且会给您留下一个无效的指针。取消引用该指针将导致。

如果要处理字符串,请改用std::string

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48775549

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档