# Указатели

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

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

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

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

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

```csharp
Object* o = new Object();
```

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

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

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

```csharp
delete o;
```

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

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

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

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

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

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