#include <iostream> #include <memory> int main() { double* pd = new double(77.77); std::cout << "*pd = " << *pd << std::endl; std::cout << "pd = " << pd << std::endl; // std::auto_ptr<double> apd = pd; // 接受指针的构造函数是explicit构造函数, 所以隐式初始化是不允许的. std::auto_ptr<double> apd(pd); std::cout << "*apd = " << *apd << std::endl; // std::cout << "apd = " << apd << std::endl; // 直接使用auto_ptr对象取地址是错误的. std::cout << "apd.get() = " << apd.get() << std::endl; // 应该使用auto_ptr对象的get成员方法返回auto_ptr对象中的基础指针. 注意: 不是 apd->get() . int* pi = new int(7); std::auto_ptr<int> api_1(pi); // std::auto_ptr<int> api_2(api_1.get()); // 不能用get方法作为创建其它auto_ptr对象的实参. std::auto_ptr<int> api_2(api_1); // api_1成为了未绑定的auto_ptr对象, api_2指向了pi. // std::cout << "*api_1 = " << *api_1 << std::endl; // 对未绑定的auto_ptr对象解引用, 其效果与对未绑定的指针解引用相同: 程序出错并且没有定义会发生什么. std::cout << "*api_2 = " << *api_2 << std::endl; float* pf = new float( static_cast<float>(0.77) ); // 0.77是double类型, 强转下. std::auto_ptr<float> apf; // apf = pf; // 与内置指针不同, 不能直接将一个地址(或其它指针)赋给auto_ptr对象. apf.reset(pf); // 只能调用reset方法来改变指针. std::cout << "*apf = " << *apf << std::endl; apf.reset(0); // 复位auto_ptr对象, 传0给reset方法即可. apf变成了未绑定的auto_ptr对象. return 0; } // ------------------------ // 控制台输出: // ------------------------ // *pd = 77.77 // pd = 003B6110 // *apd = 77.77 // apd.get() = 003B6110 // *api_2 = 7 // *apf = 0.77