На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
[!] Как относитесь к модерированию на этом форуме? Выскажите свое мнение здесь
  
> Static переменная не ресетиться при удалении объекта
    Подскажите пожалуйста, объявляю в классе
    ExpandedWrap disabled
      static int a = 0;

    Затем создаю динамический объект этого класса
    ExpandedWrap disabled
      Class *Class1 = new Class();

    переменная при каждом входе в функцию отрабатывает как надо.
    Затем я удаляю объект класса
    ExpandedWrap disabled
      delete Class1;


    Через некоторое время вновь создаю объект этого же класса
    ExpandedWrap disabled
      Class *Class1 = new Class();


    и моя static int a хранит предыдущее значение, словно объект и не удалялся. Кто-нибудь сталкивался с таким или это бага билдера?
    Code Gear 2009
      Это не баг. Читайте о работе с памятью.

      1. Когда вы "удаляете" данные, вы помечаете участок памяти как "свободный". Если за время работы в этот участок никто ничего не запишет, он так и будет продолжать хранить ваши данные, пока вы не выключите ПК, или не сбросите содержимое ОЗУ другим способом.
      2. Вам просто повезло, что выделение очередной порции памяти после delete приходится на тот же участок что был выдан ранее.

      В случае с malloc/free можно было делать memcpy, и обнулять данные, перед использованием, чтобы как раз таки, получать девственно чистый экземпляр данных, в случае же классов и new/delete - такой подход скорее всего, является неверным, или даже опасным. Это вам надо уточнить у других обитателей форума...

      Добавлено
      Цитата secondd @
      static int a = 0;

      А, чё то я туплю, статик переменная не лежит в экземпляре класса. Она привязанна к самому классу. Когда вы удаляете экземпляр класса - статик данные остаются. Это тоже нормально.
      Сообщение отредактировано: VisualProg -
        Йето не баг, а поведение по специфицации. По специфицации даже не языка, а всего программирования. Статичецкие об'екты живут, пока ассембли лоадед.
          Цитата secondd @
          Кто-нибудь сталкивался с таким или это бага билдера?

          Нет, все работает правильно. static член класса - это та же самая глобальная переменная, только в области видимости класса. Если нужно, чтобы она обновлялась, то делай обычной и обнуляй в конструкторе.
            Спасибо за ответы, хотя странно что объявляю ее в одной из функций класса и доступна она только в той функции, получается ее инициализировать в конструкторе не могу, это так?
              Локальные static-переменные так и задуманы. Можно представлять это как работу не с "int a", а с указателем, что-то типа "int *a". Т.е. настоящий участок памяти, хранящий static_переменные, это вовсе не стек вызывающей стороны. Это отдельный кусок памяти, лежащий где-то сбоку и инициализирующийся при старте.

              https://www.geeksforgeeks.org/memory-layout-of-c-program
              0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
              0 пользователей:


              Рейтинг@Mail.ru
              [ Script execution time: 0,0246 ]   [ 16 queries used ]   [ Generated: 28.03.24, 16:12 GMT ]