今个在写线性表顺序实现代码时,碰到了个大坑!
void DestroyList(SqList& L) {
if (L.elem) {
delete L.elem;
}
L.length = 0;
L.elem = NULL;
cout << "销毁成功!" << endl;
}
delete L.elem;//这行一直报错
在网上搜了搜资料后,原因可能是
- 内存越界,比如“数组越界”、“释放已经释放掉的内存”、“共享内存引发的问题”、“释放野指针的问题”等。
- 用到的第三方库版本不一致
需要自己慢慢调试解决
结果调试出来个这东西,
然后被我瞎搞出来了其他没见过的东西
再次搜索各种资料后发现
对于自定义数据类型,我定义的时个book
struct Book {
string id; //IBSN
string name; //书名
double price; //价格
};
假设通过new申请了一个对象数组,
typedef struct {
Book* elem; //存储空间机制
int length; //表长
}SqList;
//初始化顺序表L
Status InitList(SqList& L) {
L.elem = new Book[MAXSIZE]; //这里
if (!L.elem) {
exit(OVERFLOW);
}
L.length = 0;
return OK;
}
对于此对象数组的内存释放,需要做两件事情:
- 一是释放最初申请的那部分空间。
- 二是调用析构函数完成清理工作。
对于内存空间的清理,由于申请时记录了其大小,因此无论使用delete还是delete[ ]都能将这片空间完整释放,而问题就出在析构函数的调用上,当使用delete时,仅仅调用了对象数组中第一个对象的析构函数,而使用delete [ ]的话,将会逐个调用析构函数。
所以就加了个[]就解决了
void DestroyList(SqList& L) {
if (L.elem) {
delete []L.elem;
}
L.length = 0;
L.elem = NULL;
cout << "销毁成功!" << endl;
}
总之,new申请的内存,释放时用delete,使用new [ ]申请的内存释放时要用delete [ ]
TODO:暂时感觉还有点不对劲,以后在看看!