簡體   English   中英

賽格。 在std :: vector上推送指針時出錯

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM