Какая самая опасная особенность С++?

Я слышал много раз, что фраза Bjarne Stroustrup "С++ затрудняет стрельбу в ногу, но когда вы это делаете, она снимает всю ногу", и я действительно не знаю, как это звучит.

Какая самая худшая вещь, которая когда-либо случалась с вами (или, что более правильно, с вашим программным обеспечением) при программировании на С++? Каким образом это может быть более опасно, чем скажем, например, C?

Ответ 1

delete [] array;

иногда может стать

delete array;

в руках кого-то, кто этого не знает. Отслеживание этой ошибки может сосать ужасно, и не происходит, когда вы делаете malloc и бесплатно.

Ответ 3

Требование виртуального деструктора легко пропустить для новых пользователей (хотя я думаю, что большинство компиляторов достаточно умны, чтобы указать этот вариант).

Ответ 4

Перегрузка оператора. Очень легко понять, что происходит. Легко упустить из виду тот факт, что перегрузка продолжается, даже для опытных разработчиков на С++.

Ответ 5

Я передал это вспомогательной функции в другом объекте из конструктора. Вспомогательная функция добавила указатель на список объектов, которые он поддерживал. Конечно, после того, как конструктор закончил и вернул объект, объект находился в другом месте в памяти, а указатель, сохраненный в другом объекте, больше недействителен. Хлоп!

Ответ 6

Я бы сказал, автоматическое преобразование типов. С++ может создавать временные переменные неинтуитивными способами с помощью автоматического преобразования типов.

Ответ 7

Его реализация обработки исключений - это легкий путь для утечек памяти.

Ответ 8

Вероятно, самый опасный аспект С++, который не существует в C, - это способность переопределять операторы для сложных типов. Например, может быть очень просто сделать добавление вычитания (и наоборот).

Это глупо, что кто-то это сделает, но это можно сделать. Сделать это опасным.

Ответ 9

Если вы собираетесь сравнить безопасность С++ и C, то вы пропустили точку этой фразы. С++, возможно, не безопаснее, чем C.

Если сравнение действительно может быть сделано с таким языком, как Java. По сути, Java обрабатывает вашу память для вас, поэтому вы не будете иметь поведение undefined при вызове памяти за пределами памяти, которую использует ваша программа (выходят за рамки на массивы и т.д.).

Чтобы решить ваш вопрос, самое худшее, что случилось со мной, было переполнение буфера, чтобы переопределить мой собственный пароль (я сделал это целенаправленно, однако).

Ответ 10

Я всегда интересовался этой цитатой. Я не могу придумать, каким образом С++ более опасен, чем C.

В любом случае, я должен сказать, что самая опасная "функция" заключается в том, что вам нечего мешать доступу к нераспределенной памяти. Это ошибка, которую почти невозможно отлаживать, вызывает всевозможные случайные действия, от сбоев до нуля до всего лишь странного поведения.

Ответ 11

  • Перегрузка оператора, если не выполнена правильно
  • множественное наследование (легкомысленное использование)
  • переполнение буфера