удаление объекта, который был инициализирован разыменованием нового объекта - PullRequest
0 голосов
/ 16 октября 2019

У меня есть следующий класс:

Теперь я думаю о реализации моего конструктора следующим образом:

в основном разыменование объекта, возвращаемого новой операцией. сейчас ... это кажется неправильным, и мне, вероятно, следовало бы поработать с указателями, но я бы хотел попробовать себя, чтобы, возможно, заставить это работать и научиться чему-то новому.

Так что моей проблемой будет удаление этогообъект ... мой деструктор для Dense не работает, так как у меня вот так:

, но, очевидно, я получаю эту ошибку:

free (): неверный указатель

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

Спасибо.

Ответы [ 2 ]

1 голос
/ 16 октября 2019

Нет необходимости делать это так сложно. Вы можете вызывать конструкторы прямо из списка инициализаторов. Здесь абсолютно нет необходимости в new. Также вам не нужно delete эти объекты. Их деструкторы будут вызываться автоматически, если уничтожено Dense.

Dense::Dense(): weights(), //Calls constructor Matrix()
                bias(), //Calls constructor Matrix()
                act(ActivationType::Relu), //Calls constructor Activation(ActivationType::Relu)
                input() //Calls constructor Matrix()
{}


Кроме того, то, что вы пытаетесь сделать с указателями, работать не будет. Например, &bias будет адресом смещения переменной-члена и не имеет ничего общего с указателем, возвращаемым new Matrix().
0 голосов
/ 16 октября 2019

так, как я могу освободить выделенную память так, как я это реализовал?

Вы просто не можете, и вы создали утечку памяти.


Объяснение:

Когда вы пишете:

int a = *(new int(5)); // Really bad

Вы в основном:

  • выделяете int накуча
  • разыменовывает значение r
  • назначает его (копирует) переменной в стеке

Ни разу вы не заботились о сохранении возвращаемого указателяnew заявления. a - это другой int, то есть копия того, что вы выделили в кучу.

Вы не можете удалить a, потому что этосоздается в стеке. Так как a является другим объектом, адрес a отличается от с адресом int, который вы выделили в куче с помощью new.

Таким образом, удаление &a очевидно запрещено Неопределенное поведение и никак не может удалить int, который вы создали с помощью new. И так как вы не сохранили возвращенный указатель оператора new, у вас нет способа его извлечь: это утечка памяти.


Если вы получили ссылку вместо копии, вымог бы удалить его:

int & a = *(new int(5));
delete &a; // fine

Но это слишком сложный, менее эффективный и бессмысленный способ простого выполнения:

int a = 5; // destroyed at scope's end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...