我遇到了这样的C ++测验:如果指针被删除两次会怎么样?
答案是D。
我有点失落,是什么"陷阱"意思?它是C ++中的一个特殊术语吗?
答案 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 ***