正确使用std::shared_ptr和std::auto_ptr需要了解它们的特性和使用场景。
std::shared_ptr是一种智能指针,它可以在多个地方共享同一个对象,当最后一个指向该对象的std::shared_ptr被销毁或重新分配时,该对象将被自动删除。std::shared_ptr的特性包括:
std::auto_ptr是一种智能指针,它可以在单个地方拥有同一个对象,当std::auto_ptr被销毁或重新分配时,该对象将被自动删除。std::auto_ptr的特性包括:
正确使用std::shared_ptr和std::auto_ptr需要根据具体的使用场景来选择。如果需要在多个地方共享同一个对象,则应该使用std::shared_ptr。如果需要在单个地方拥有同一个对象,则应该使用std::auto_ptr。
以下是一个使用std::shared_ptr的示例代码:
#include<iostream>
#include<memory>
class MyClass {
public:
MyClass() {
std::cout << "MyClass constructor called"<< std::endl;
}
~MyClass() {
std::cout << "MyClass destructor called"<< std::endl;
}
};
int main() {
std::shared_ptr<MyClass> p1 = std::make_shared<MyClass>();
std::shared_ptr<MyClass> p2 = p1;
std::cout << "p1 use count: " << p1.use_count()<< std::endl;
std::cout << "p2 use count: " << p2.use_count()<< std::endl;
return 0;
}
以上代码中,我们使用std::make_shared函数创建了一个std::shared_ptr<MyClass>对象p1,并将其赋值给另一个std::shared_ptr<MyClass>对象p2。在程序结束时,p1和p2都指向同一个MyClass对象,因此该对象将不会被删除。
以下是一个使用std::auto_ptr的示例代码:
#include<iostream>
#include<memory>
class MyClass {
public:
MyClass() {
std::cout << "MyClass constructor called"<< std::endl;
}
~MyClass() {
std::cout << "MyClass destructor called"<< std::endl;
}
};
int main() {
std::auto_ptr<MyClass> p1(new MyClass());
std::auto_ptr<MyClass> p2 = p1;
return 0;
}
以上代码中,我们使用new运算符创建了一个MyClass对象,并将其赋值给一个std::auto_ptr<MyClass>对象p1。然后,我们将p1的所有权转移给另一个std::auto_ptr<MyClass>对象p2。在程序结束时,p1和p2都指向同一个MyClass对象,但是该对象将被删除两次,导致未定义行为。
总之,正确使用std::shared_ptr和std::auto_ptr需要了解它们的特性和使用场景,并根据具体的需求选择合适的智能指针。
领取专属 10元无门槛券
手把手带您无忧上云