C Управление памятью - PullRequest
       26

C Управление памятью

86 голосов
/ 24 августа 2008

Я всегда слышал, что в Си вы должны реально наблюдать за тем, как вы управляете памятью. И я все еще начинаю изучать C, но до сих пор мне вообще не приходилось делать какие-либо операции по управлению памятью. Я всегда представлял, что мне нужно выпускать переменные и делать разные уродливые вещи. Но, похоже, это не так.

Может ли кто-нибудь показать мне (с примерами кода) пример, когда вам нужно было бы заняться «управлением памятью»?

Ответы [ 12 ]

0 голосов
/ 25 августа 2008

@ Тед Персиваль :
... вам не нужно приводить возвращаемое значение malloc ().

Вы правы, конечно. Я считаю, что это всегда было правдой, хотя у меня нет копии K & R для проверки.

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

Это особенно вероятно, если ваш компилятор понимает комментарии в стиле C ++.

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

0 голосов
/ 24 августа 2008

Конечно. Если вы создаете объект, который существует вне области действия, в которой вы его используете. Вот надуманный пример (имейте в виду, что мой синтаксис будет отключен; мой C ржавый, но этот пример все еще иллюстрирует концепцию):

class MyClass
{
   SomeOtherClass *myObject;

   public MyClass()
   {
      //The object is created when the class is constructed
      myObject = (SomeOtherClass*)malloc(sizeof(myObject));
   }

   public ~MyClass()
   {
      //The class is destructed
      //If you don't free the object here, you leak memory
      free(myObject);
   }

   public void SomeMemberFunction()
   {
      //Some use of the object
      myObject->SomeOperation();
   }


};

В этом примере я использую объект типа SomeOtherClass во время жизни MyClass. Объект SomeOtherClass используется в нескольких функциях, поэтому я динамически распределяю память: объект SomeOtherClass создается при создании MyClass, используется несколько раз в течение срока службы объекта и затем освобождается после освобождения MyClass.

Очевидно, что если бы это был реальный код, не было бы никакой причины (кроме, возможно, использования стека памяти) для создания myObject таким способом, но этот тип создания / уничтожения объектов становится полезным, когда у вас много объектов и вы хотите для точного контроля, когда они создаются и уничтожаются (например, чтобы ваше приложение не высасывало 1 ГБ ОЗУ в течение всего срока его службы), а в оконной среде это в значительной степени является обязательным, поскольку объекты, которые вы создаете (кнопки скажем,) должны существовать далеко за пределами какой-либо конкретной функции (или даже класса).

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