Наиболее распространенные Ошибки Памяти/Утечки ресурсов

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

Этот тип дизайна называют Индуктивным Пользовательским интерфейсом. Вот документ , который Microsoft произвела в 2001 по теме. Текст может быть немного датирован, но принципы являются обычно симпатичной пользой. Единственный протест состоит в том, что существует баланс, который будет найден в разработке как это. Если Вы упрощаете слишком много, пользователи должны будут перейти повсеместно для выполнения простых задач, и усиления в понятности будут потеряны underproductivity.

5
задан 2 revs, 2 users 77% 26 August 2009 в 06:32
поделиться

5 ответов

Есть гораздо больше типов ошибок, чем просто утечки. В порядке от худшего к лучшему:

Повреждение памяти.

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

  • Повреждение "случайное расположение"
    • Данные сохраняются в той области памяти, которой может управлять пользователь.
    • Данные сохраняются в массиве без проверки индексов.
    • Объект типа, производного от X , сохраняется в элемент массива зарезервирован для базового типа X , а размер X больше, чем размер его базы.
  • Пожизненное повреждение
  • Память не освобождена из-за потери указателя - последний указатель на память был очищен до вызова освобождения, поэтому нет возможности освободить его.
  • Память не освобождена из-за неправильной идентификации, когда данные в нем больше нет необходимости. Например, статический кеш, используемый для некоторой временной задачи, никогда не очищается.
5
ответ дан 13 December 2019 в 22:12
поделиться

Циклические ссылки являются обычным явлением, и они не решаются с помощью std :: auto_ptr или boost :: shared_ptr В вашем списке нет замены (2), которая использует ваш мозг.

2
ответ дан 13 December 2019 в 22:12
поделиться
  • Вызов виртуальной функции, такой как «очистка», из деструктора базового класса. Вы, вероятно, делаете это только один раз ... (больше нет полиморфизма в деструкторе базового класса)
  • Не очищаете stl :: multimap (без стирания, только вставку) и задаетесь вопросом, почему ваша программа продолжает работать медленнее.
2
ответ дан 13 December 2019 в 22:12
поделиться

Ошибка, сделанная людьми, слишком знакомыми с автоматической сборкой мусора (с помощью смарт-указателей):

class A { 
public:
    int avery_useful_calculation()const { return 4; } 
private:
    // class shouldn't be instantiated as an automatic variable (on stack)
    virtual ~A(){} 
};

// client code: needs a very useful calculation

int i = (new A)->avery_useful_calculation();
1
ответ дан 13 December 2019 в 22:12
поделиться

Возможно, я вышел за рамки, но у меня были странные ошибки при попытке «удалить» неинициализированные указатели.

Чтобы «избежать» утечки памяти, я использую структуру try {} __finally {} , если она реализована (но я где-то читал, что может быть неэффективно, если исключение было вызвано во вспомогательном вызове)

0
ответ дан 13 December 2019 в 22:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: