Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
alig007
1 / 1 / 0
Регистрация: 30.01.2013
Сообщений: 28
16.07.2013, 03:56     Статический указатель #1
пример, есть такая конструкция например:
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();
получается память я выделил, а как ее освободить, и нужно ли вообще освобождать, если указатель статический?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.07.2013, 03:56     Статический указатель
Посмотрите здесь:

Указатель на статический массив C++
C++ Нужно создать статический массив строк как статический массив указателей на строки. Условние ниже -->
Статический указатель класса и конструктор в private C++
C++ создать статический массив строк как статический массив указателей на строки, задание ниже -->
Указатель на статический массив как параметр шаблона C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
soican
49 / 23 / 1
Регистрация: 16.11.2011
Сообщений: 329
Записей в блоге: 5
16.07.2013, 04:18     Статический указатель #2
Цитата Сообщение от alig007 Посмотреть сообщение
C++
1
2
private:
static A *ptr;
по идее то, что в привате используется только внутри самого класса
Flassie
181 / 166 / 29
Регистрация: 03.08.2012
Сообщений: 591
Завершенные тесты: 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;
}
Вроде как-то так
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,919
Записей в блоге: 2
Завершенные тесты: 1
16.07.2013, 07:38     Статический указатель #4
Цитата Сообщение от alig007 Посмотреть сообщение
и нужно ли вообще освобождать
После завершения программы система почистит за ней, но всё равно не хорошо оставлять эту проблему системе
Цитата Сообщение от alig007 Посмотреть сообщение
а как ее освободить
std::shared_ptr в помощь. при уничтожении глобальных объектов, будет вызван деструктор shared_ptr
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
это вариант, но неужели для этого не предусмотрено никакого другого механизма?
Nick Alte
Эксперт С++
1590 / 982 / 115
Регистрация: 27.09.2009
Сообщений: 1,897
Завершенные тесты: 1
16.07.2013, 11:37     Статический указатель #6
Предусмотрено! unique_ptr (а в старом стандарте убогий auto_ptr, но в данном случае тоже вполне сойдёт).
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;
Это делает невозможным примение интеллектуальных указателей. Что делать тогда?
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 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();
alig007
1 / 1 / 0
Регистрация: 30.01.2013
Сообщений: 28
16.07.2013, 15:13  [ТС]     Статический указатель #9
без интеллектуальных указателей обойтись можно?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.07.2013, 15:16     Статический указатель
Еще ссылки по теме:

C++ Указатель на статический трехмерный массив
Указатель или ссылка на указатель. В чем разница? C++
C++ Преобразовать указатель одного типа в указатель другого.

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

Или воспользуйтесь поиском по форуму:
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,919
Записей в блоге: 2
Завершенные тесты: 1
16.07.2013, 15:16     Статический указатель #10
Цитата Сообщение от alig007 Посмотреть сообщение
без интеллектуальных указателей обойтись можно?
После выхода из приложения, система почистит память
А можно создать объект-заглушку и брать его адрес когда нужно
тогда и динамическая память не понадобится(пост #8)
Yandex
Объявления
16.07.2013, 15:16     Статический указатель
Ответ Создать тему
Опции темы

Текущее время: 15:12. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru