Что мне нужно знать о памяти в C ++? - PullRequest
16 голосов
/ 15 декабря 2009

Я делал все возможное, чтобы выучить C ++, но мое предыдущее обучение не дотягивает до одной важной проблемы: управления памятью. Все мои основные языки имеют автоматическую сборку мусора, поэтому отслеживать все на самом деле никогда не было необходимости. Я пытался прочитать об управлении памятью в C ++ онлайн, но у меня есть это потрясающее подозрение, что я что-то упускаю.

Итак, вот вопрос из нескольких частей:

  • Какой минимум мне нужно знать об управлении памятью? (или где я могу это выяснить)?
  • Куда мне обращаться за промежуточными и продвинутыми знаниями / учебными пособиями / и т. д. (как только я закончу с основами)?
  • В чем разница в производительности между указателями и ссылками?
  • Я слышал, что в циклах необходимо убедиться, что вы вызываете delete для любых новых указателей, прежде чем цикл будет повторяться , Это правильно? Вам нужно что-то сделать со ссылками?
  • Какие есть классические примеры утечек памяти?
  • Что мне нужно знать о следующем (и буду ли я когда-либо реально использовать их - - если да, то где?)
    • malloc
    • free
    • calloc
    • realloc

*********************** ОБНОВЛЕНИЕ *******************

Это относится к ссылке на lmgtfy в первом комментарии (автор Ewan). Если вы начинаете читать информацию, которая доступна там, это не полезно для новичка. Я думаю, что это великая теория, но она не является ни уместной, ни полезной для этого вопроса.

Ответы [ 15 ]

1 голос
/ 16 декабря 2009

Все упоминают о новых и удаленных файлах, но в большинстве случаев они вам не нужны и не должны использоваться явно:

  • Лучше всего использовать стандартные контейнеры и позволить управлению памятью.
  • Если это невозможно, используйте умные указатели с подсчетом ссылок или, в крайнем случае, с более разумной сборкой мусора.

Конечно, по соображениям производительности вам может потребоваться случайное создание новой и удаляемой пары в критичной для производительности ситуации, но это должно быть скорее исключением, чем правилом.

1 голос
/ 16 декабря 2009

Узнайте о RAII. Некоторые люди здесь указали на это, но в то же время объяснили новый / удалить материал, не подчеркивая важность RAII. С RAII вам не нужно беспокоиться об управлении памятью.

Люди, плохо знакомые с C ++, склонны кодировать, как в Java, помещая «новое» везде. Во многих случаях это плохая привычка, в некоторых случаях вы не можете избежать этого (но из опыта моих проектов это, скорее всего, никогда).

Просто добавьте этот комментарий, чтобы подчеркнуть его;) Однако все комментарии совершенно верны.

1 голос
/ 15 декабря 2009

Вот что часто привлекает студентов: большие, действительно большие объекты, такие как массивы, должны размещаться в динамической памяти (то есть с использованием new).

Кроме того, не проходите мимо больших объектов. Передайте указатели, предпочтительные умные указатели, объектам. Копирование больших объектов отнимает много процессорного времени.

Настройка и документирование правил размещения объектов и владения ими. Является ли вызываемый или вызывающий объект владельцем объекта?

Не возвращать ссылки на локальные объекты и указатели на локальные объекты.

0 голосов
/ 15 декабря 2009

Поскольку я изучал C ++, я обнаружил, что использование инструмента анализа памяти, такого как Valgrind , незаменим для выявления утечек памяти. Когда вы запускаете вашу программу (скомпилированную с символами отладки) из Valgrind, она идентифицирует строки, где выделяется память, но никогда не освобождается позже.

Я использую следующие аргументы командной строки:

 valgrind --leak-check=yes --num-callers=8 ./myExecutable

Обратите внимание, что ваша программа будет работать намного медленнее, чем сама по себе, но это того стоит.

0 голосов
/ 15 декабря 2009

new и delete являются двумя наиболее важными ключевыми словами для управления памятью. И в самом простом случае вам просто нужно помнить, чтобы вызывать delete для каждого объекта, для которого вы вызываете new. Поэтому, если вы вызываете new в цикле, вам нужно убедиться, что вы вызываете delete для каждого из этих new 'ed объектов. Вам не нужно делать это из цикла, если вы сохраняете копию каждого указателя где-то, что может быть удалено позже.

malloc, free, calloc и realloc, вероятно, более продвинуты, чем то, о чем вам нужно беспокоиться. Я думаю, просто помните, что они есть, если стандарт new / delete когда-либо чувствует себя ограниченным.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...