Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
alig007
1 / 1 / 0
Регистрация: 30.01.2013
Сообщений: 28
#1

Статический указатель - C++

16.07.2013, 03:56. Просмотров 654. Ответов 9
Метки нет (Все метки)

пример, есть такая конструкция например:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
class A
{
...
};
 
class B
{
private:
static A *ptr;
...
};
 
A* B::ptr = new A();
получается память я выделил, а как ее освободить, и нужно ли вообще освобождать, если указатель статический?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.07.2013, 03:56
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Статический указатель (C++):

Статический указатель - C++
Привет! Возникли вопросы в процессе изучения C/С++. Если объявить статическую (static) локальную переменную, то эта переменная будет...

Указатель на статический массив - C++
Есть несколько статических массивов: const char a = { 0, 1, 2, 3 }; const char b = { 4, 5, 6, 7 }; const char c = { 8, 9, 10, 11 }; ...

Не работает статический указатель - C++
Добрый день! Подскажите пожалуйста почему не работает такая конструкция ? class A { public: static Message *K; };

Указатель на статический трехмерный массив - C++
Как сделать указатель на статический трехмерный массив? Почему компилятор сам не определяет размер массива,а выбивает ошибку int mass= ...

Статический член указатель на класс - C++
Доброго времени суток. Что требовалось: создать статический указатель на класс CPerson, чтобы сохранить в него нужный объект. Как пытался...

Статический указатель класса и конструктор в private - C++
Всем привет! Вчера препод показал один прием, я до конца не могу понять как он работает. В классе есть статический указатель class...

9
soican
49 / 23 / 1
Регистрация: 16.11.2011
Сообщений: 329
Записей в блоге: 5
16.07.2013, 04:18 #2
Цитата Сообщение от alig007 Посмотреть сообщение
C++
1
2
private:
static A *ptr;
по идее то, что в привате используется только внутри самого класса
0
Flassie
184 / 169 / 29
Регистрация: 03.08.2012
Сообщений: 592
Завершенные тесты: 2
16.07.2013, 06:10 #3
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
class A { ... };
class B { 
   public: 
   static A *a; 
};
 
A* B::a = new A;
 
int main()
{
   B b;
   delete b.a;
}
Вроде как-то так
0
Croessmah
Ушел
13764 / 8014 / 923
Регистрация: 27.09.2012
Сообщений: 19,724
Записей в блоге: 3
Завершенные тесты: 1
16.07.2013, 07:38 #4
Цитата Сообщение от alig007 Посмотреть сообщение
и нужно ли вообще освобождать
После завершения программы система почистит за ней, но всё равно не хорошо оставлять эту проблему системе
Цитата Сообщение от alig007 Посмотреть сообщение
а как ее освободить
std::shared_ptr в помощь. при уничтожении глобальных объектов, будет вызван деструктор shared_ptr
0
alig007
1 / 1 / 0
Регистрация: 30.01.2013
Сообщений: 28
16.07.2013, 11:34  [ТС] #5
Цитата Сообщение от Flassie Посмотреть сообщение
C++
1
2
3
4
...
   B b;
   delete b.a;
....
Вроде как-то так
Ну во-первых поле приватным допустим должно быть. Во вторых, ну а если я после создам еще один обьект класса B ? А статическое поле a уже будет разрушено, не вариант так.

Добавлено через 1 минуту
Цитата Сообщение от Croessmah Посмотреть сообщение
После завершения программы система почистит за ней, но всё равно не хорошо оставлять эту проблему системе

std::shared_ptr в помощь. при уничтожении глобальных объектов, будет вызван деструктор shared_ptr
это вариант, но неужели для этого не предусмотрено никакого другого механизма?
0
Nick Alte
Эксперт С++
1646 / 1018 / 120
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
16.07.2013, 11:37 #6
Предусмотрено! unique_ptr (а в старом стандарте убогий auto_ptr, но в данном случае тоже вполне сойдёт).
0
alig007
1 / 1 / 0
Регистрация: 30.01.2013
Сообщений: 28
16.07.2013, 13:24  [ТС] #7
дело в том что реализуется красно-черное дерево. там в узлах вместо null используется заглушка nil, которая представляется специальным узлом. ясно что заглушка нужна всего одна, сколько бы ни было деревьев и узлов в них. Если это дерево и узлы
C++
1
2
3
4
5
6
7
8
9
10
11
struct Node
{
...
Node *right, *left, *parent;
};
class Tree
{
private:
static const Node *nil;
};
Node* Tree::nil = new Node();
то, в коде фигурирует много выражений вида
C++
1
2
3
Node *node = new Node();
node -> left = nil;
node -> right = nil;
Это делает невозможным примение интеллектуальных указателей. Что делать тогда?
0
gray_fox
What a waste!
1551 / 1256 / 74
Регистрация: 21.04.2012
Сообщений: 2,634
Завершенные тесты: 3
16.07.2013, 13:38 #8
alig007, может как-нибудь так?
C++
1
2
3
4
5
6
7
8
9
10
Node * nil() {
   static Node nilValue;
   return &nilValue;
}
 
// ...
 
Node *node = new Node();
node -> left = nil();
node -> right = nil();
Добавлено через 7 минут
Цитата Сообщение от alig007 Посмотреть сообщение
Это делает невозможным примение интеллектуальных указателей.
Почему?
C++
1
2
3
4
5
6
7
8
9
10
11
12
class Tree {
 
   static std::auto_ptr<Node> const nil;
};
 
std::auto_ptr<Node> const Tree::nil(new Node);
 
// ...
 
Node *node = new Node();
node -> left = nil.get();
node -> right = nil.get();
0
alig007
1 / 1 / 0
Регистрация: 30.01.2013
Сообщений: 28
16.07.2013, 15:13  [ТС] #9
без интеллектуальных указателей обойтись можно?
0
Croessmah
Ушел
13764 / 8014 / 923
Регистрация: 27.09.2012
Сообщений: 19,724
Записей в блоге: 3
Завершенные тесты: 1
16.07.2013, 15:16 #10
Цитата Сообщение от alig007 Посмотреть сообщение
без интеллектуальных указателей обойтись можно?
После выхода из приложения, система почистит память
А можно создать объект-заглушку и брать его адрес когда нужно
тогда и динамическая память не понадобится(пост #8)
1
16.07.2013, 15:16
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.07.2013, 15:16
Привет! Вот еще темы с ответами:

Указатель на статический массив как параметр шаблона - C++
Добрый день. Необходимо параметр шаблона сделать указателем и передавать в него указатель на статический массив: template&lt;size_t...

Статический указатель класса на объект этого же класса - C++
Не пойму: что в этом коде не так? #include &lt;iostream&gt; #include &lt;cstdlib&gt; using namespace std; struct A { int x; ...

Как получить ссылку на указатель или указатель на указатель в массиве? - C++
В процессе реализации сортировки пузырьком натолкнулся на такую проблему: как поменять значения указателей, передаваемых в функцию. Если...

Нужно создать статический массив строк как статический массив указателей на строки. Условние ниже --> - C++
Слова английского текста рассортировать по возрастанию количества заданной буквы в слове. Слова с одинаковым количеством такой буквы...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru