Вопрос об delete () экземпляре класса и его статических методах / переменных - PullRequest
0 голосов
/ 12 января 2011

Рассмотрим этот класс в демонстрационных целях:

class test{
private:
   int y;
   HANDLE handle;
   static int x;

public:
   test()
   int add();
   static int sub();
}


test::test() {
    [....]
    sub = 1;
    handle = (HANDLE)_beginthreadex(NULL,0,&test::sub,NULL,0,0);
}

test::sub() {
    [....]
    _endthreadex(0)
}

Я немного не уверен насчет статических методов / переменных и у меня теперь есть несколько вопросов;

1) Если я создаю классэкземпляр test, а затем вызывать delete test, очищается ли статическая переменная тоже?Если нет, нужно ли очищать все статические переменные вручную в деструкторе с помощью delete () (или это free ())?

2) когда поток, выполняющий sub (), завершается с помощью _endthreadex, нужно ли выполнять какую-либо ручную очистку статическим методом?Как видите, переменная handle относится к потоку.

Заранее спасибо

Ответы [ 5 ]

4 голосов
/ 12 января 2011

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

1 голос
/ 12 января 2011

Ключевое слово «static» в данном случае подразумевает, что в памяти есть только один экземпляр переменной, и он «принадлежит» классу test.Вскоре после того, как экземпляр 'test' исчезнет, ​​переменная test :: x останется вокруг и будет доступна любым другим экземплярам 'test' и статической функции 'sub' (так как она является закрытой переменной).Очистка не требуется, так как в памяти находится только этот единственный экземпляр.

Если причина сделать его статическим, чтобы он был доступен в 'sub', вы можете вместо этого передать его в качестве параметра.В качестве альтернативы, вы можете передать экземпляр 'test' методу потока, и тогда он больше не будет статичным, поскольку вы сможете вызывать нестатические функции для объекта.

0 голосов
/ 12 января 2011

static int будет находиться в BSS или разделе неинициализированных данных , поэтому, как и другие предлагали, он будет доступен в течение всего срока действия программы.

0 голосов
/ 12 января 2011

Вы не должны никогда пытаться освободить переменную static.Если вы обнаружите, что хотите / нуждаетесь в этом, то, вероятно, вы вообще не хотите использовать static.

0 голосов
/ 12 января 2011

статическая переменная сохраняется из одного экземпляра класса в другой, поэтому они являются статическими. Если вы хотите, чтобы они были специфичными для экземпляра, удалите ключевое слово static.

...