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