赛格。在std :: vector上推送指针时出错

时间:2013-09-06 19:00:34

标签: c++ valgrind

我已经用Valgrind描述了以下代码并获得了以下内容:

Use of uninitialised value of size 8
invalid read of size 8

执行此行时

compuMethod->keywordlist->push_back(keyword);

但是,我已经明确初始化了keyword ...

#include <iostream>
#include <vector>
#include <map>
#include <string>
using namespace std;

class Keyword;
class CompuMethod;

typedef std::vector<Keyword*> KeywordList;
std::map<std::string, CompuMethod*> AllCompuMethods;

class Keyword
{
    private:
        std::string _name;

    public:
        Keyword(std::string name) : _name(name) {}
        virtual ~Keyword() {}
        std::string GetName() { return(_name); }
};

class CompuMethod
{
    public:
        CompuMethod(){}
        ~CompuMethod(){}
        KeywordList* keywordlist;

};

int main()
{
    CompuMethod* compuMethod = new CompuMethod();
    Keyword* keyword = new Keyword("terminal");
    compuMethod->keywordlist->push_back(keyword);

    //Call delete for each new
    return 0;
}

我显然忽视了一些事情。我在这方面做了什么:

Keyword* keyword = new Keyword("terminal");

是不是在初始化keyword

2 个答案:

答案 0 :(得分:2)

keyword已正确初始化。问题是你没有分配 compuMethod->keywordlist

你应该使keywordlist成为KeywordList而不是指针,或者在CompuMethod()中分配它(在析构函数中删除它)

答案 1 :(得分:2)

keywordlist是指向std::vector<Keyword*>

的指针

你不能简单地将物品推入其中。

使用以下命令为构造函数

中的向量指针分配内存

CompuMethod(){keywordlist = new KeywordList();}

并相应地更新析构函数

~CompuMethod(){ delete keywordlist; }

修改

greyfade评论 -

但是不要忘记复制/移动ctor和operator =正确处理指针。否则,你最终将获得双重释放