C ++最危险的特性是什么?

时间:2009-07-07 17:56:12

标签: c++ language-features

我听过很多次Bjarne Stroustrup的短语“C ++让你更难以自己的脚射击;但是当你这样做时,它会把整条腿拉下来”而我不知道我真的知道它是否像听起来一样糟糕。

在使用C ++编程时,您遇到过的最糟糕的事情(或者更恰当地说,对您的软件来说)是什么?例如,哪种方式比普通的C更危险?

11 个答案:

答案 0 :(得分:11)

delete [] array;

有时会成为

delete array;

在一个不知道的人的手中。跟踪该错误可能会非常糟糕,并且当您正在进行malloc和free时不会发生。

答案 1 :(得分:7)

缓冲区溢出必须是c和c ++中最危险的东西。这也是Microsoft announced that they have added memcpy() to their list of banned functions

的原因

多重继承是另一个

答案 2 :(得分:5)

虚拟析构函数要求很容易让新来者错过(尽管我认为大多数编译器足够聪明,可以指出这一点)。

答案 3 :(得分:2)

Operator overloading。很容易让人难以理解正在发生的事情。即使是经验丰富的C ++开发人员,也很容易忽视重载的事实。

答案 4 :(得分:2)

我将 this 传递给构造函数中另一个对象中的辅助函数。辅助函数将指针添加到它正在维护的对象列表中。当然,在构造函数完成并返回之后,对象位于内存中非常不同的位置,而存储在另一个对象中的指针不再有效。糟糕!

答案 5 :(得分:2)

我会说自动类型转换。 C ++可以通过自动类型转换以不直观的方式创建临时变量。

答案 6 :(得分:1)

它的异常处理实现很容易导致内存泄漏。

答案 7 :(得分:0)

C中不存在的C ++最危险的方面可能是覆盖复杂类型的运算符。例如,可以非常容易地进行减法加法(反之亦然)。

任何人都是愚蠢的,但是可以做到。让它变得危险。

答案 8 :(得分:0)

如果您要比较C ++与C的安全性,那么您就错过了该短语的重点。可以说C ++并不比C更安全。

真正可以用Java等语言进行比较的地方。从本质上讲,Java会为您处理内存,因此在调用程序当前正在使用的内存之外的内存时,不会出现未定义的行为(超出数组的范围等)。

为了解决你的问题,发生在我身上的最糟糕的事情是缓冲区溢出,以覆盖我自己的密码(但我故意这样做了)。

答案 9 :(得分:0)

我一直想知道那句话。我想不出C ++比C. 更危险的任何方式

无论如何,我不得不说最危险的“功能”是没有什么可以阻止你访问未分配的内存。这是一个几乎不可能调试的错误,导致各种各样的随机行为,从崩溃到没有任何东西到只是奇怪的行为。

答案 10 :(得分:0)

  • 操作员超载(如果未正确实施)
  • 多重继承(易于滥用)
  • 缓冲区溢出