void insert(T val){
val
является параметром для этой функции. Этот объект, этот val
, существует только до возврата этой функции. В этот момент он уничтожается, как и все остальное, объявленное в нестатической области видимости внутри функции. Вот как работает C ++. Как только insert()
возвращается, этого val
больше нет. Перестает существоватьИдет навстречу своему создателю. Он становится бывшим объектом, который больше не существует и полностью находится в прошлом.
Ваша insert()
функция выполняет следующее:
Node* temp = new Node(&val);
Вы передаете указатель на этоval
параметр для конструктора Node
, а Node
затем сохраняет указатель на параметр в insert()
как собственный член класса.
Это замечательно, но как только insert()
возвращает, сохраненный указатель в new
-ed Node
становится указателем на уничтоженный объект, а разыменование этого указателя становится неопределенным поведением.
Затем вы пытаетесь разыменовать исходный указатель,который больше не указывает на действительный объект.
Это объясняет наблюдаемое неопределенное поведение в вашем коде.
Суть в том, что дизайн ваших классов и шаблонов в корне ошибочен. Для Node
нет очевидной цели использовать указатель. Node
должен просто хранить T
как своего собственного члена класса, как value
, вместо value
, являющегося указателем на какой-то другой T
, который существует где-то, и может быть уничтожен в любое время, что не являетсяпод управлением Node
.
Другая проблема в показанном коде состоит в том, что двум конструкторам Node
не удалось инициализировать указатели next
и prev
в NULL
. Это также приведет к неопределенному поведению.