[英]Seg. Fault When Pushing a Pointer on a std::vector
我用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
?
keyword
已正確初始化。 問題是你沒有分配compuMethod->keywordlist
您應該做keywordlist
一個KeywordList
,而不是一個指針或分配它CompuMethod()
在析構函數刪除它)
keywordlist
是指向std::vector<Keyword*>
的指針
你不能簡單地將物品推入其中。
使用以下命令為構造函數中的向量指針分配內存
CompuMethod(){keywordlist = new KeywordList();}
並相應地更新析構函數
~CompuMethod(){ delete keywordlist; }
編輯 :
greyfade評論 -
“ 但是不要忘記復制/移動ctor和operator =正確處理指針。否則,你最終將獲得雙重釋放 ”
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.