"如果C ++指针被删除两次,它可能会导致陷阱" - 陷阱是什么意思?

时间:2015-01-09 12:08:29

标签: c++ terminology

我遇到了这样的C ++测验:如果指针被删除两次会怎么样?

  • A)它可以中止程序
  • B)它可能导致失败
  • C)它可能导致错误
  • D)它可能导致陷阱

答案是D。

我有点失落,是什么"陷阱"意思?它是C ++中的一个特殊术语吗?

3 个答案:

答案 0 :(得分:7)

它在C ++中没有任何意义。这可能意味着操作系统级错误(例如Posix信号),但没有上下文我不能说。

正确答案是它会导致未定义的行为;但是所有答案都可以被认为是正确的,因为未定义的行为可能导致任何这些事情发生。

答案 1 :(得分:6)

我将直接引用the Wikipedia article on traps

  

在计算和操作系统中,陷阱(也称为异常或故障)通常是[NB 1] [1]一种通常由异常条件引起的同步中断(例如,断点,除零,内存访问无效)。陷阱通常导致切换到内核模式,其中操作系统在将控制返回到原始进程之前执行一些动作。系统进程中的陷阱比用户进程中的陷阱更严重,并且在某些系统中是致命的。在某些用法中,术语陷阱特指用于启动上下文切换到监视程序或调试器的中断。

这是一个高度通用的术语,并不是由C ++定义的,更不用说特定于它了。更重要的是,您必须注意多选答案中的“可以”,因为无法保证在双重删除对象时会发生任何

事实上,所有四个答案基本上都说同样的事情。

测验似乎很困惑,因为“删除指针”可能不是它的含义。

不要与SNMP陷阱混淆:

  

在SNMP中,陷阱是一种PDU,用于报告有关受管子系统的警报或其他异步事件。

答案 2 :(得分:1)

删除已删除的相同内存是未定义的行为。任何事情都可能发生,虽然在我的情况下,它给出了运行时错误。使用g ++ 4.9.1

在C ++中编译

我的节目:

int main()
{
    int x = 5;
    int *ptr = &x;
    delete ptr;
    delete ptr;
}

它出现以下错误:

*** Error in `./t': free(): invalid pointer: 0xbf971994 ***