【问题标题】:"If a C++ pointer is deleted twice, it can cause a trap" -- what does trap mean?“如果 C++ 指针被删除两次,会导致陷阱”——陷阱是什么意思?
【发布时间】:2015-01-09 12:08:29
【问题描述】:

我遇到了这样一个 C++ 测验:如果指针被删除两次会发生什么?

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

答案是 D。

我有点迷茫,“陷阱”是什么意思?它是 C++ 中的一个特殊术语吗?

【问题讨论】:

  • 正确答案:E) It can cause demons to fly out of your nose(我不是在开玩笑)
  • 所有答案都是正确的;它可能导致任何事情。
  • @bolov 虽然可以想象,但不太可能,不是吗?
  • @Yakk 也许我没有意识到更大的问题;什么硬件可能导致所描述的行为?我计划在今天晚些时候出现在公众场合,在那里存在恶魔会很不幸,所以最好仔细检查我的硬件。

标签: c++ terminology


【解决方案1】:

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

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

【讨论】:

  • 我们可以说。这是一个成熟的通用计算术语。当我们从事语言律师时,这种“任何事情都可能发生”的千篇一律的答案很好,但是这个人正在询问在实践中会发生什么。在实践中,“任何事情都可能发生”是不正确的。
  • @LightnessRacesinOrbit:嗯,我还没有完全确定它在这种情况下的具体含义,所以我至少不能说。对不起,如果我没有遇到过这个词的定义明确且普遍接受的含义,那么我将我的无知推断到其他人身上。我并没有说任何事情都可能发生,只是说这些事情都可能发生。
  • 我在回答中引用了它的定义。所以我的回答可能会对你有所帮助。
  • @LightnessRacesinOrbit:谢谢。引用该维基百科页面的来源,“这个术语与汇编程序编程有关 [...],随着汇编程序的作用不断缩小,它似乎正在逐渐淡入程序员的历史。”所以我会坚持我的观点,它没有明确的含义。
  • 这当然是你的权利。我的经验表明相反,但我无法说服你。但是,如果您考虑“陷阱表示”一词的含义,它可能会有所帮助。
【解决方案2】:

我直接引用the Wikipedia article on traps:

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

这是高度概括的术语,C++ 没有定义,更不用说特定于它了。更关键的是,您必须注意多项选择答案中的“可以”,因为不能保证当您重复删除一个对象时,任何事情都会发生。

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

无论如何,测验似乎很混乱,因为“删除指针”可能不是它的意思。

不要与 SNMP 陷阱混淆:

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

【讨论】:

  • @lightnness-races-in-orbit 谢谢,所以陷阱一个技术俚语,可能意味着任何严重的错误。明白了。
  • 一个可以在这里也引用C标准来支持:“3.19.5 执行一个陷阱中断程序的执行,使得没有进一步的操作执行”
  • @athos:是操作系统生成的,是的。
【解决方案3】:

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

我的程序:

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

它给出了以下错误:

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

【讨论】:

  • 我不太确定这是如何回答这个问题的。这只是关于trap这个词,而不是实际发生的事情。
  • 我认为@athos 询问如果指针被删除两次会发生什么。我刚刚证明了选项 A) 可能是正确的。
  • 虽然不是严格意义上的问题答案,但它仍然是正确的并且可能有用。
  • 谢谢@LightnessRacesinOrbit。我在这里有点新,下次会尝试写更好的答案。 :)
  • @ShauryaChats:欢迎 :) 我从这个答案中注意到的一件事是你的格式很好,特别是对于新手。谢谢!
猜你喜欢
  • 2015-02-20
  • 1970-01-01
  • 1970-01-01
  • 2011-12-13
  • 1970-01-01
  • 1970-01-01
  • 2013-12-21
  • 2011-02-26
  • 1970-01-01
相关资源
最近更新 更多