Управление памятью C в структуре ссылок

#c #struct #reference

#c #структура #ссылка

Вопрос:

Я новичок в C и пытаюсь понять, что (если что-нибудь) нужно сделать, чтобы безопасно освободить память, выделенную в структуре ссылок. Вот упрощенный пример:

 #include <RcppArmadillo.h>

typedef struct dist {
  const arma::colvecamp; mu;
  const arma::matamp; Sigma;
  dist(const arma::colvecamp; mu, const arma::matamp; Sigma): mu(mu), Sigma(Sigma) {}; 
} dist;

arma::mat test_struct(const arma::vecamp; my_vector, const::armaamp; my_matrix, const int iter = 1000) {
  for (int i = 0; i < iter; i  ) {
    dist d(my_vector, my_matrix);
    // Some other things here
  }
  // Some other things here
} 
  

В цикле for test_struct функции я понимаю, что каждая структура выходит за пределы области видимости в конце итерации, в которой она была создана, и освобождается, но что нужно сделать со ссылками на объекты из библиотеки Armadillo? Автоматически ли вызываются деструкторы для двух объектов, на которые ссылаются ссылки, или мне нужно сделать что-то еще, чтобы предотвратить утечку памяти? Или мне нужно указать деструктор в структуре?

Любая помощь приветствуется!

Комментарии:

1. Просто обратите внимание, что в C нет необходимости вводить структуры typedef. struct TypeName {}; достаточно.

Ответ №1:

Я новичок в C и пытаюсь понять, что (если что-нибудь) нужно сделать, чтобы безопасно освободить память, выделенную в структуре ссылок.

Вообще ничего, поскольку память не выделяется динамически, поэтому освобождать нечего.

В цикле for функции test_struct я понимаю, что каждая структура выходит за пределы области видимости в конце итерации, в которой она была создана, и освобождается

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

что нужно сделать со ссылками на объекты из библиотеки Armadillo?

Вообще ничего.

Автоматически ли вызываются деструкторы для двух объектов, на которые ссылаются ссылки

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

нужно ли мне делать что-то еще, чтобы предотвратить утечку памяти?

В этом коде нет утечки памяти.

нужно ли мне указывать деструктор в структуре?

Нет.

Ответ №2:

Нет необходимости что-либо делать со ссылками.

Память, которую они представляют, не принадлежит структуре и не нуждается в каком-либо управлении.

Автоматически ли вызываются деструкторы для двух объектов, на которые ссылаются ссылки, или мне нужно сделать что-то еще, чтобы предотвратить утечку памяти?

Деструкторы объектов, на которые ссылаются, будут вызываться, когда они выходят за пределы области видимости или извлекаются delete из динамически выделяемой памяти.

Или мне нужно указать деструктор в структуре?

Нет, как упоминалось выше, в этом нет необходимости.