Sample
передается по значению SomeFunc
, что означает, что копия сделана.Копия имеет тот же ptr
, поэтому, когда эта копия уничтожается при возврате SomeFunc
, ptr
удаляется для обоих объектов.Затем, когда вы вызываете PrintVal()
в основном, вы разыменовываете этот неверный указатель.Это неопределенное поведение.Даже если это работает, тогда, когда s1
уничтожается, ptr
снова удаляется, что также является UB.
Кроме того, если компилятору не удается удалить копию в Sample s1= 10;
, s1
не будетдаже быть действительным для начала, потому что, когда временный уничтожен, указатель будет удален.Однако большинство компиляторов избегают этого копирования.
Вам необходимо либо правильно выполнить копирование, либо запретить копирование.Copy-ctor по умолчанию не подходит для этого типа.Я бы рекомендовал либо сделать этот тип типом значения (который содержит его члены напрямую, а не по указателю), чтобы работал copy-ctor по умолчанию, или использовать умный указатель для хранения ссылки, чтобы он мог управлять ресурсами для ссылки по ссылке.вы и copy-ctor по умолчанию все еще будете работать.
Одна из вещей, которые мне действительно нравятся в C ++, это то, что он действительно удобен для повсеместного использования типов значений, и если вам нужен ссылочный тип, вы можете просто обернуть любое значениевведите в умный указатель.Я думаю, что это намного лучше, чем в других языках, в которых есть примитивные типы с семантикой значений, но тогда пользовательские типы по умолчанию имеют семантику ссылок.