今个在写线性表顺序实现代码时,碰到了个大坑!
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:暂时感觉还有点不对劲,以后在看看!


本文讲述了在实现线性表顺序存储时遇到的内存管理问题,重点讨论了使用`delete`与`delete[]`的区别。作者在尝试销毁对象数组时,发现`delete L.elem;`导致只析构了首元素,而`delete[] L.elem;`则正确地析构了所有元素。通过这次经验,强调了对于通过`new[]`申请的内存必须使用`delete[]`来释放的重要性,并提醒开发者注意内存管理和对象析构的细节。

4723

被折叠的 条评论
为什么被折叠?



