Указатели

Указатели Vala позволяют управлять памятью вручную. Обычно когда вы создаете экземпляр типа вы получаете указатель на него и Vala сама позаботиться о его своевременном удалении объекта, когда к нему не останутся доступные ссылки. Запрашивая указатель вместо ссылки вы берете на себя ответственность за удаление объекта, следовательно, вы получаете больший контроль над использованием памяти.

Эта функциональность не всегда необходима, т.к. современные компьютеры достаточно производительны, чтобы осуществлять подсчет ссылок и имеют достаточно памяти, поэтому небольшие потери памяти при этом не так существенны. Ручное управление памятью может понадобиться, когда:

Вы хотите оптимизировать определенную часть программы.

Когда вы работаете с библиотекой, не имеющей подсчета ссылок (если она не основана на gobject).

Для создания объекта и получения указателя на него пишем:

Object* o = new Object();

Для использования членов объекта:

o->method_1();
o->data_1;

Для освобождения памяти, на которую ссылается указатель:

delete o;

Vala поддерживает извлечение адреса (&) и разыменование указателя (*):

int i = 42;
int* i_ptr = &i;    //  адрес переменной
int j = *i_ptr;     // разыменование

Поведение при этом немножко отличается от ссылок, т.к. вы можете получить адрес и разыменовать во время присвоений:

Foo f = new Foo();
Foo* f_ptr = f;    //  извлечение адреса
Foo g = f_ptr;     // разыменование

unowned Foo f_weak = f;  // эквивалент второй строки

Использование указателей на объекты подобно использованию бесхозяйных ссылок.

Last updated