1

我用 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

4

2 回答 2

2

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

您应该制作keywordlistaKeywordList而不是指针或将其分配CompuMethod()(在析构函数中删除它)

于 2013-09-06T19:02:07.203 回答
2

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

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

使用以下为构造函数中指向向量的指针分配内存

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

并相应地更新析构函数

~CompuMethod(){ delete keywordlist; }

编辑

grayfade 评论 -

"但不要忘记复制/移动 ctor 和 operator= 以正确处理指针。否则,您将得到双重释放"

于 2013-09-06T19:05:11.933 回答