Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.144.113.197] |
|
Сообщ.
#1
,
|
|
|
Подскажите пожалуйста, объявляю в классе
static int a = 0; Затем создаю динамический объект этого класса Class *Class1 = new Class(); переменная при каждом входе в функцию отрабатывает как надо. Затем я удаляю объект класса delete Class1; Через некоторое время вновь создаю объект этого же класса Class *Class1 = new Class(); и моя static int a хранит предыдущее значение, словно объект и не удалялся. Кто-нибудь сталкивался с таким или это бага билдера? Code Gear 2009 |
Сообщ.
#2
,
|
|
|
Это не баг. Читайте о работе с памятью.
1. Когда вы "удаляете" данные, вы помечаете участок памяти как "свободный". Если за время работы в этот участок никто ничего не запишет, он так и будет продолжать хранить ваши данные, пока вы не выключите ПК, или не сбросите содержимое ОЗУ другим способом. 2. Вам просто повезло, что выделение очередной порции памяти после delete приходится на тот же участок что был выдан ранее. В случае с malloc/free можно было делать memcpy, и обнулять данные, перед использованием, чтобы как раз таки, получать девственно чистый экземпляр данных, в случае же классов и new/delete - такой подход скорее всего, является неверным, или даже опасным. Это вам надо уточнить у других обитателей форума... Добавлено Цитата secondd @ static int a = 0; А, чё то я туплю, статик переменная не лежит в экземпляре класса. Она привязанна к самому классу. Когда вы удаляете экземпляр класса - статик данные остаются. Это тоже нормально. |
Сообщ.
#3
,
|
|
|
Йето не баг, а поведение по специфицации. По специфицации даже не языка, а всего программирования. Статичецкие об'екты живут, пока ассембли лоадед.
|
Сообщ.
#4
,
|
|
|
Цитата secondd @ Кто-нибудь сталкивался с таким или это бага билдера? Нет, все работает правильно. static член класса - это та же самая глобальная переменная, только в области видимости класса. Если нужно, чтобы она обновлялась, то делай обычной и обнуляй в конструкторе. |
Сообщ.
#5
,
|
|
|
Спасибо за ответы, хотя странно что объявляю ее в одной из функций класса и доступна она только в той функции, получается ее инициализировать в конструкторе не могу, это так?
|
Сообщ.
#6
,
|
|
|
Локальные static-переменные так и задуманы. Можно представлять это как работу не с "int a", а с указателем, что-то типа "int *a". Т.е. настоящий участок памяти, хранящий static_переменные, это вовсе не стек вызывающей стороны. Это отдельный кусок памяти, лежащий где-то сбоку и инициализирующийся при старте.
https://www.geeksforgeeks.org/memory-layout-of-c-program |