我已经用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
?
答案 0 :(得分:2)
keyword
已正确初始化。问题是你没有分配
compuMethod->keywordlist
你应该使keywordlist
成为KeywordList
而不是指针,或者在CompuMethod()
中分配它(在析构函数中删除它)
答案 1 :(得分:2)
keywordlist
是指向std::vector<Keyword*>
你不能简单地将物品推入其中。
使用以下命令为构造函数
中的向量指针分配内存 CompuMethod(){keywordlist = new KeywordList();}
并相应地更新析构函数
~CompuMethod(){ delete keywordlist; }
修改:
greyfade评论 -
“但是不要忘记复制/移动ctor和operator =正确处理指针。否则,你最终将获得双重释放”