分段错误,并传入指针

时间:2014-03-10 22:49:22

标签: c++ pointers

运行以下代码时,我收到了Segmentation fault (core dumped)

我被告知seg故障可能是由于大多数时候指针不好造成的。现在,我对这种语言比较陌生,据说我确信我在这里做了一些明显错误但由于我缺乏经验和目前的熟练程度而无法发现它。

以下代码是在vector方法中创建PeekDeque<StringWrap>main个对象。然后它将指向vector的指针传递给函数testNewWord。然后,此函数创建一个新的PeekDeque<StringWrap>对象,然后将其推送到vector的后面。嗯,这就是我想要做的事情!

#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
#include <fstream>
#include <sstream>

using namespace std;

void testNewWord(string word, vector<PeekDeque<StringWrap> >* chains) {
    PeekDeque<StringWrap>* newpd = new PeekDeque<StringWrap>(100);
    newpd->pushFront(StringWrap(word));
    chains->push_back(*newpd);
}

int main(int argc, char* argv[]){   
    vector<PeekDeque<StringWrap> >* chains = new vector<PeekDeque<StringWrap> >(); 

    string word;

    string infileName = argv[1];
    ifstream* INFILEp = new ifstream(infileName.c_str(), ios_base::in);

    while ((*INFILEp) >> word) {
        testNewWord(word, chains);

    }

    INFILEp->close();

}

我在这里做错了什么?也许在空指针上调用delete?放轻松我。

3 个答案:

答案 0 :(得分:4)

你在这里使用指针的地方实际上都不需要(也不应该是)指针。相反,它们应该是常规对象,然后通过 references 传递。

尝试更换:

vector<PeekDeque<StringWrap> >* chains = new vector<PeekDeque<StringWrap> >();

简单地说:

vector<PeekDeque<StringWrap> > chains;

void testNewWord(string word, vector<PeekDeque<StringWrap> >* chains) {
     PeekDeque<StringWrap>* newpd = new PeekDeque<StringWrap>(100);

使用:

void testNewWord(const string& word, vector<PeekDeque<StringWrap> >& chains) {
     PeekDeque<StringWrap> newpd(100);

when you should use references vs. pointers上阅读更多内容。一般用C ++,如果你绝对不能使用引用,只使用指针。您还必须将所有->更改回.,因为引用的行为类似于实际对象,而不是指向它的指针。

答案 1 :(得分:2)

我没有看到你测试你的argc param。如果没有从命令行传递参数会发生什么?

答案 2 :(得分:1)

您的代码似乎没有任何问题;你在做什么是完全合法和正确的。所以也许图片中缺少其他东西,比如你如何调用你的代码

但是 - 我确实有一个建议

    PeekDeque<StringWrap>* newpd = new PeekDeque<StringWrap>(100);
    newpd->pushFront(StringWrap(word));
    chains->push_back(*newpd);   <----

对于最后一行,调用复制构造函数,然后将新创建的对象复制到向量。这实际上是浪费资源。您可以将vector<PeekDeque<StringWrap> >* chains替换为vector<PeekDeque<StringWrap>* >* chains并保留指针。这样你可以直接推动指针,并且你可以利用分配新对象所花费的时间。