我是使用C ++的Qt应用程序的新手。我正在检查崩溃报告,我在Qt应用程序中创建了一个异常,但它绕过了该语句并成功执行。
我产生的错误如下:
int *ptr;
delete ptr;
delete ptr;
但它没有产生任何错误或异常。
任何人都可以告诉我这背后的原因是什么?
答案 0 :(得分:5)
C ++遵循“你不为你没有要求的东西买单”的原则。这意味着,当Java和C#等语言执行大量运行时检查并在出现错误时抛出明确定义的异常时,C ++不会这样做。在许多情况下,它只是简单地说“如果你做了非法的事情,程序的行为将是不确定的”,并留下它。未定义的行为意味着允许任何事情发生 - 允许程序崩溃,似乎工作,在线订购披萨。
删除未初始化的指针或未由new
分配的内容正是一种此类未定义行为诱导操作。在这种情况下,没有给你一个明确的错误完全取决于程序的权利。但是,你的堆可能已经损坏而无法修复。
此外,在您的特定情况下,如果ptr
的值为null,则代码实际上定义良好时会有一个条件。在空指针上使用delete
是完全有效的,结果是无操作。这样的初始化会自动发生在全局变量中,而某些编译器会在调试版本中为局部变量和执行此操作。
答案 1 :(得分:1)
删除未初始化的指针只是未定义的行为,因此不需要向您提供任何错误消息 - 实际上它可以为您订购披萨。
虽然我很惊讶编译器至少没有发出警告。这应该很容易诊断。