C++ 分段错误,并传入指针

C++ 分段错误,并传入指针,c++,pointers,C++,Pointers,当运行下面的代码时,我得到一个分段错误(内核转储) 我被告知seg故障大部分时间可能是由于指针错误造成的。现在,我对这门语言还比较陌生,尽管如此,我确信我在这里做了一些明显错误的事情,但由于我缺乏经验和目前的熟练程度,我无法发现它 下面的代码正在main方法中创建PeekDeque对象的vector。然后,它将指向向量的指针传递给函数testNewWord。然后,此函数创建一个新的PeekDeque对象,然后将其推到向量的后面。不管怎么说,这就是我想做的 #include <iostrea

当运行下面的代码时,我得到一个
分段错误(内核转储)

我被告知seg故障大部分时间可能是由于指针错误造成的。现在,我对这门语言还比较陌生,尽管如此,我确信我在这里做了一些明显错误的事情,但由于我缺乏经验和目前的熟练程度,我无法发现它

下面的代码正在
main
方法中创建
PeekDeque
对象的
vector
。然后,它将指向
向量的指针传递给函数
testNewWord
。然后,此函数创建一个新的
PeekDeque
对象,然后将其推到
向量的后面。不管怎么说,这就是我想做的

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

}
#包括
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
void testNewWord(字符串字、向量*链){
PEEKEDEQUE*newpd=新PEEKEDEQUE(100);
newpd->pushFront(StringWrap(word));
链条->推回(*newpd);
}
intmain(intargc,char*argv[]){
向量*链=新向量();
字符串字;
字符串infileName=argv[1];
ifstream*infiep=新的ifstream(infileName.c_str(),ios_base::in);
而((*infiep)>>word){
testNewWord(单词、链);
}
内嵌->关闭();
}

我做错了什么?可能正在对空指针调用delete?对我放松点。

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

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

尝试替换:

vector<PeekDeque<StringWrap> >* chains = new vector<PeekDeque<StringWrap> >();
vector*chains=newvector();
简单地说:

vector<PeekDeque<StringWrap> > chains;
向量链;

void testNewWord(字符串字、向量*链){
PEEKEDEQUE*newpd=新PEEKEDEQUE(100);
与:

void testNewWord(常量字符串和单词、向量和链){
peek-deque-newpd(100);

<>请阅读更多。一般来说,C++如果只使用指针,如果你绝对不能使用引用。你还必须把所有的<代码> ->代码>返回到<代码> .<代码>,因为引用行为就像是实际对象,而不是指针。

你的代码似乎没有任何问题;你所做的是完美的。合法且正确。因此,可能图片中缺少了其他内容,比如您如何调用代码

然而,我有一个建议

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

链条->向后推(*newpd);为什么你不能使用一个调试器并一步一步地执行你的程序呢?这真的比问更难吗?我以前从来没有这样做过——我是新手。我应该寻找什么呢?对于带有调试器的IDE。选择任意一组免费的。例如Netbeans。或者,如果你在linux上,使用gdb。你用
gdb my_executable
,一个d然后在提示下键入
run
。一旦崩溃,键入
backtrace
,它将准确地告诉您导致崩溃的步骤顺序。感谢您的调试建议,看起来我有一些事情要做。这是一个非常有用的建议,基于我最终尝试完成的内容,包括proc正在处理大量数据!虽然您可以通过将testNewWord()方法改为接受
peek deque&deque
并填充它,然后返回void来完成相同的任务,而不必使用指针。然后,您可以通过在
向量上放置一个空deque并传递
返回()来分配上面的数组
方法。如果您担心生命周期问题,通常是在需要使用指针时,您应该尝试使用
共享\u ptr
/
智能\u ptr
,这样就可以在不需要手动操作的情况下完成内存分配。正如编写的代码一样,该代码会像筛子一样泄漏内存。
void testNewWord(const string& word, vector<PeekDeque<StringWrap> >& chains) {
     PeekDeque<StringWrap> newpd(100);
    PeekDeque<StringWrap>* newpd = new PeekDeque<StringWrap>(100);
    newpd->pushFront(StringWrap(word));
    chains->push_back(*newpd);   <----