C++链表大调用数分段错误
C++ linked list big call number Segmentation fault
我创建了链表,现在当我想在我的列表中查找特定数据时遇到问题:示例我在我的列表中插入 200 000 个字符串,当我调用 list->at(1)(1 id 是列表中的最后一个字符串)我遇到了分段错误,如果我调用 list->at(100 000) 它工作完美
我的代码是:
stringList.h:
#ifndef STRINGLIST_H
#define STRINGLIST_H
#include <iostream>
#include <string>
using namespace std;
class stringList
{
public:
stringList();
virtual ~stringList();
void insert(string *newString);
void insert(string newString);
int size();
string at(int poz);
void display();
void clear();
protected:
private:
string* atP(int *poz);
stringList *itsList;
string *itsString;
int *sizeString;
string *buff;
//staticint *sizeString;
int *itsPoz;
};
#endif // STRINGLIST_H
stringList.cpp:
#include "stringList.h"
stringList::stringList()
{
itsList=0;
itsString=0;
sizeString=0;
itsPoz=new int(0);
buff=new string;
}
stringList::~stringList()
{
delete sizeString;
sizeString=0;
delete itsPoz;
itsPoz=0;
delete buff;
buff=0;
delete itsString;
itsString=0;
}
void stringList::insert(string *newString){
if(!sizeString){
sizeString=new int(0);
}
if(!sizeString){
sizeString=new int(0);
}
stringList *newList=new stringList;
stringList *tmp=new stringList;
if(itsList){
*sizeString=*itsList->itsPoz+1;
tmp=this->itsList;
this->itsList=newList;
this->itsList->itsString=newString;
*this->itsList->itsPoz=*sizeString;
this->itsList->itsList=tmp;
}else{
this->itsList=newList;
this->itsList->itsString=newString;
*this->itsList->itsPoz=0;
}
}
void stringList::insert(string newString){
string *p_string=new string;
if(!sizeString){
sizeString=new int(0);
}
*p_string=newString;
stringList *newList=new stringList;
stringList *tmp=new stringList;
if(itsList){
*sizeString=*itsList->itsPoz+1;
tmp=this->itsList;
this->itsList=newList;
this->itsList->itsString=p_string;
*this->itsList->itsPoz=*sizeString;
this->itsList->itsList=tmp;
}else{
this->itsList=newList;
this->itsList->itsString=p_string;
*this->itsList->itsPoz=0;
}
}
int stringList::size(){
if(sizeString)
return *sizeString+1;
else
return 0;
}
string stringList::at(int poz){
if(!sizeString){
return "NEMA LISTE";
}
if(poz>*sizeString){
return "";
}
buff=this->atP(&poz);
return *buff;
}
string* stringList::atP(int *poz){
if(*this->itsList->itsPoz==*poz){
return this->itsList->itsString;
}
else{
return this->itsList->atP(poz);
}
}
void stringList::display(){
if(this->itsList){
this->itsList->display();
}
if(itsString){
cout<<*itsString<<" , "<<*itsPoz<<endl;
}
}
void stringList::clear(){
if(this->itsList->itsList){
this->itsList->clear();
}
delete itsList;
delete sizeString;
sizeString=0;
itsList=0;
}
我会添加静态成员:指向第一个和最后一个元素的指针。它们对很多事情都很有用
这是什么样的og segmetation fault?当线程试图访问没有明确权限的内存时,会产生执行保护模式?
如果 nr 2,则说明您的代码中存在错误。检查边界和类似的东西。
你想看我写在 fl 上的一个简单的链表吗?
在 stringList::at
中,您正在调用 stringList::atP
,它会调用 stringList::at
。这导致递归并且很可能导致堆栈溢出,然后以段错误终止程序。您可以将其更改为迭代方式,类似于
list = this;
do {
if (itsPoz==poz) { /* found */ }
} while (list = this->itsList);
但是代码还有很多其他问题(永远不要在 header 的全局范围内做 using namespace std;
,你显然是在没有所有权保证的情况下存储指针(即唱智能指针),等等)
我创建了链表,现在当我想在我的列表中查找特定数据时遇到问题:示例我在我的列表中插入 200 000 个字符串,当我调用 list->at(1)(1 id 是列表中的最后一个字符串)我遇到了分段错误,如果我调用 list->at(100 000) 它工作完美 我的代码是:
stringList.h:
#ifndef STRINGLIST_H
#define STRINGLIST_H
#include <iostream>
#include <string>
using namespace std;
class stringList
{
public:
stringList();
virtual ~stringList();
void insert(string *newString);
void insert(string newString);
int size();
string at(int poz);
void display();
void clear();
protected:
private:
string* atP(int *poz);
stringList *itsList;
string *itsString;
int *sizeString;
string *buff;
//staticint *sizeString;
int *itsPoz;
};
#endif // STRINGLIST_H
stringList.cpp:
#include "stringList.h"
stringList::stringList()
{
itsList=0;
itsString=0;
sizeString=0;
itsPoz=new int(0);
buff=new string;
}
stringList::~stringList()
{
delete sizeString;
sizeString=0;
delete itsPoz;
itsPoz=0;
delete buff;
buff=0;
delete itsString;
itsString=0;
}
void stringList::insert(string *newString){
if(!sizeString){
sizeString=new int(0);
}
if(!sizeString){
sizeString=new int(0);
}
stringList *newList=new stringList;
stringList *tmp=new stringList;
if(itsList){
*sizeString=*itsList->itsPoz+1;
tmp=this->itsList;
this->itsList=newList;
this->itsList->itsString=newString;
*this->itsList->itsPoz=*sizeString;
this->itsList->itsList=tmp;
}else{
this->itsList=newList;
this->itsList->itsString=newString;
*this->itsList->itsPoz=0;
}
}
void stringList::insert(string newString){
string *p_string=new string;
if(!sizeString){
sizeString=new int(0);
}
*p_string=newString;
stringList *newList=new stringList;
stringList *tmp=new stringList;
if(itsList){
*sizeString=*itsList->itsPoz+1;
tmp=this->itsList;
this->itsList=newList;
this->itsList->itsString=p_string;
*this->itsList->itsPoz=*sizeString;
this->itsList->itsList=tmp;
}else{
this->itsList=newList;
this->itsList->itsString=p_string;
*this->itsList->itsPoz=0;
}
}
int stringList::size(){
if(sizeString)
return *sizeString+1;
else
return 0;
}
string stringList::at(int poz){
if(!sizeString){
return "NEMA LISTE";
}
if(poz>*sizeString){
return "";
}
buff=this->atP(&poz);
return *buff;
}
string* stringList::atP(int *poz){
if(*this->itsList->itsPoz==*poz){
return this->itsList->itsString;
}
else{
return this->itsList->atP(poz);
}
}
void stringList::display(){
if(this->itsList){
this->itsList->display();
}
if(itsString){
cout<<*itsString<<" , "<<*itsPoz<<endl;
}
}
void stringList::clear(){
if(this->itsList->itsList){
this->itsList->clear();
}
delete itsList;
delete sizeString;
sizeString=0;
itsList=0;
}
我会添加静态成员:指向第一个和最后一个元素的指针。它们对很多事情都很有用
这是什么样的og segmetation fault?当线程试图访问没有明确权限的内存时,会产生执行保护模式?
如果 nr 2,则说明您的代码中存在错误。检查边界和类似的东西。
你想看我写在 fl 上的一个简单的链表吗?
在 stringList::at
中,您正在调用 stringList::atP
,它会调用 stringList::at
。这导致递归并且很可能导致堆栈溢出,然后以段错误终止程序。您可以将其更改为迭代方式,类似于
list = this;
do {
if (itsPoz==poz) { /* found */ }
} while (list = this->itsList);
但是代码还有很多其他问题(永远不要在 header 的全局范围内做 using namespace std;
,你显然是在没有所有权保证的情况下存储指针(即唱智能指针),等等)