分段错误,传入指针

Segmentation fault, and passing in pointers

本文关键字:指针 错误 分段      更新时间:2023-10-16

当运行下面的代码时,我得到一个Segmentation fault (core dumped)

我被告知segfault很可能是由于坏的指针造成的。现在,我对这门语言比较陌生,我确信我在这里做了一些明显的错误,但由于我的经验不足和目前的熟练程度,我无法发现它。

下面的代码在main方法中创建PeekDeque<StringWrap>对象的vector。然后将指向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是在一个空指针上被调用?对我好点

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

试试更换:

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);

阅读更多关于何时应该使用引用和指针的信息。一般来说,在c++中,只有在绝对不能使用引用的情况下才使用指针。您还必须将所有->更改为.,因为引用的行为就像它们是实际对象,而不是指向它的指针。

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

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

然而,我有一个建议

    PeekDeque<StringWrap>* newpd = new PeekDeque<StringWrap>(100);
    newpd->pushFront(StringWrap(word));
    chains->push_back(*newpd);   <----
对于最后一行的

,调用复制构造函数并将新创建的对象复制到vector中。这实在是浪费资源。您可以将vector<PeekDeque<StringWrap> >* chains替换为vector<PeekDeque<StringWrap>* >* chains并保留指针。通过这种方式,您可以直接推送指针,并利用分配新对象所花费的时间。