RE原因:Aborted
这次有一个特别冷门的错误想要分享一下……
一般RE的原因都是段错误(segmentation fault)什么的,也就是访问了不该访问的东西。也是,乱闯别人家门,能不报错么?
然而这次RE的原因却不清不楚,提交完了什么信息也没有,去洛谷编译器编译运行一下,给出的提示是“Aborted”
搜索了一下Aborted的原因,并没有找到什么很好的答案,不过幸运的是静态调错了半分钟(瞎瞅一通),发现了RE的原因。
发现了么?
lss指针指向的是一个数组(第一个红框),而在析构函数(第二个红框中),却按照元素的方式进行delete,因此导致的RE。正确的方式应该是:
delete []lss;
不过我尚没有明白的是,这为什么不是编译错误而是运行错误?可能还需要查些资料才能想通。
经过初步的测试,这并不会产生编译错误。但也并不是所有的情况都会RE,RE的根本原因尚未知晓。
产生Aborted错误的原因似乎是因为调用了abort函数
void abort();
该函数定义于头文件#include<cstdlib>,似乎是一个C函数。
进一步实验,触发这个错误似乎需要满足以下条件:
条件1.对象是一个结构体/类;
条件2.这个类需要有自己定义(而非编译器合成)的析构函数,或者这个类的成员满足条件2。
(注意到,条件2(应该算)是递归定义的)
假如没有析构函数,就不会触发这个错误。这与构造函数或是结构体内部元素似乎无关。
至于为什么析构函数和这个错误有关,我依旧不知道……这可能和delete的实现有关,然而delete的实现我看不到……
网上找到一篇文章:戳这里,没太看懂,不知道和这个有没有关系。