C++;:过程结束,退出代码为139(被信号11:SIGSEGV中断) 我用C++测试列表,并为它创建了最简单的类。我删除了一些检查和其他方法,以仅显示要点

C++;:过程结束,退出代码为139(被信号11:SIGSEGV中断) 我用C++测试列表,并为它创建了最简单的类。我删除了一些检查和其他方法,以仅显示要点,c++,segmentation-fault,C++,Segmentation Fault,CMakeLists.txt CMAKE_MINIMUM_REQUIRED(VERSION 3.00) PROJECT(test) SET(CMAKE_CXX_STANDARD 98) ADD_EXECUTABLE(test main.cpp CList.h) CList.h \ifndef CLIST\H #定义CLIST_H #包括 #包括 #包括 #包括 结构城市{ 大小数据; CItem*prev; 城市*下一步; CItem(尺寸项目); ~CItem(); }; CItem::

CMakeLists.txt

CMAKE_MINIMUM_REQUIRED(VERSION 3.00)
PROJECT(test)

SET(CMAKE_CXX_STANDARD 98)

ADD_EXECUTABLE(test main.cpp CList.h)
CList.h

\ifndef CLIST\H
#定义CLIST_H
#包括
#包括
#包括
#包括
结构城市{
大小数据;
CItem*prev;
城市*下一步;
CItem(尺寸项目);
~CItem();
};
CItem::CItem(尺寸项目){
此->数据=项目;
此->上一个=空;
此->下一步=空;
}
CItem::~CItem(){
删除此->下一步;
}
类CList{
城市*第一;
城市*最后;
尺寸与长度;
公众:
CList();
~CList();
CList&add(尺寸数据);
};
CList::CList(){
此->第一个=空;
此->最后一个=空;
这个->长度=0;
}
CList::~CList(){
删除此->首先;
}
CList&CList::添加(大小数据){
CItem*项目=新CItem(数据);
如果(!项){
fputs(“内存不足”,标准);
出口(1);
}
如果(!this->length){
此->第一个=此->最后一个=项目;
}否则{
项目->上一个=本次->上一次;
此->上一个->下一个=项目;
本->末次=本->末次->下一次;
}
这->长度++;
归还*这个;
}
#endif//CLIST_H
main.cpp

#包括“CList.h”
int main(){
CList列表;
对于(大小i=0;i<1000000;i++){
列表.添加(i);
}
返回0;
}
如您所见,CList析构函数调用第一个项的CItem析构函数,它在递归中调用其他项析构函数

为了测试代码,我在列表中添加了1000000项。代码应该在exist上释放内存。但是我在CItem析构函数上得到了SIGSEGV错误(不是在第一项上)。 当我只添加100000项时,没有错误。出现错误时包含大量元素


同样,这不是真正的代码,只是一些测试。我知道我至少可以使用
std::
类来代替。我尝试使用本机类型尽可能简单地执行此操作。

您的代码会创建堆栈溢出,因为它会递归地从上一个节点的析构函数中删除下一个节点。当您有一百万个元素时,这将导致一百万个递归。在大多数平台上,堆栈大小限制在1-8MB左右,即使每个函数调用只使用8字节的堆栈(通常会更多),也会导致100万个元素的溢出

您应该以非递归方式删除
CList
析构函数中的项:

CList::~CList() {
    CItem* item = this->first;
    while (item) {
        CItem* temp = item;
        item = item->next;
        delete temp;
    }
}

我没怎么看你的代码,但可能是因为你最终出现了内存不足的问题。内存不足的问题是什么?有可用内存的析构函数。或者它们的工作方式与我预期的不同?是的,程序完成后会调用析构函数,但是,如果您尝试在列表中分配太多的项,则可能会遇到内存不足问题(系统上没有那么多内存)。我在移动设备上无法运行您的代码。但在析构函数链中,您不会将next设置回NULL,也不会在删除之前检查next是否为NULL。有可能某个东西被破坏(留下一个悬空的指针),然后作为进程再次尝试破坏exits@Kieran,删除空指针是不可操作的。通过一个抱怨双重删除的工具来发现它比让它默默地什么都不做要好。好吧,递归中的点。。。我理解你。当列表只需要删除第一个项目,其他项目将被以前的项目删除而不受列表控制时,这真是太棒了。