Вам нужно передавать общий указатель, а не ссылки и указатели непосредственно в int.
Что происходит, так это то, что общий указатель никогда не передается нигде, кроме функции test_shared_ptr ().Когда эта функция возвращается, общий указатель уничтожается.Когда он видит, что ничто другое не имеет ссылки на его память, он уничтожает память, на которую он указывал.
В основном, когда вы используете int &i
и int *i
, измените оба значения на std::tr1::shared_ptr<int> i
.
Возможно, вам нужно прочитать немного больше об общем указателе.По сути, они хранят счетчик ссылок для указателя, на который они указывают.Когда они копируются, они увеличивают счетчик ссылок, а когда они уничтожаются, уменьшают его.Когда счетчик ссылок достигает 0 (ничто другое не ссылается на память, на которую он указывает), он освобождает эту память.Таким образом, даже если что-то использует этот указатель в вашем случае, так как он не использовал общий указатель, у общего указателя нет возможности узнать, что память все еще используется, поэтому он освобождает его.