1. std::shared_ptr::reset()
:
在 C++ 中,std::shared_ptr
是用于管理共享所有权的智能指针,reset()
是 std::shared_ptr
提供的一个成员函数。这个函数的作用是将 std::shared_ptr
重新指向新的资源或者置空。如果 std::shared_ptr
不再管理任何资源,它将被置为空。
#include <memory>
#include <iostream>
int main() {
std::shared_ptr<int> ptr = std::make_shared<int>(42);
// reset 指向新的资源
ptr.reset(new int(100));
// 输出新的值
std::cout << *ptr << std::endl;
// reset 置空 shared_ptr
ptr.reset();
// 检查 shared_ptr 是否为空
if (!ptr) {
std::cout << "shared_ptr is empty." << std::endl;
}
return 0;
}
打印信息:
100
shared_ptr is empty.
在这个例子中,ptr.reset(new int(100))
使 ptr
不再指向原始的 int
资源,而是指向一个新的动态分配的 int。
2. std::unique_ptr::reset()
std::unique_ptr
是用于独占所有权的智能指针,也提供了 reset()
函数。它的行为与 std::shared_ptr
中的类似,但由于 std::unique_ptr
的特性,它不会共享所有权。
#include <memory>
#include <iostream>
int main() {
std::unique_ptr<int> ptr = std::make_unique<int>(42);
// reset 指向新的资源
ptr.reset(new int(100));
// 输出新的值
std::cout << *ptr << std::endl;
// reset 置空 unique_ptr
ptr.reset();
// 检查 unique_ptr 是否为空
if (!ptr) {
std::cout << "unique_ptr is empty." << std::endl;
}
return 0;
}
打印信息:
100
unique_ptr is empty.
这个例子中的 ptr.reset(new int(100))
同样使 ptr
不再指向原始的 int
资源,而是指向一个新的动态分配的 int
。
参考:https://www.cnblogs.com/keye/p/17901921.html
3. std::unique_ptr和std::shared_ptr的区别:
std::unique_ptr和std::shared_ptr的主要区别在于它们的所有权模型、性能、以及适用场景。
-
所有权模型:
std::unique_ptr
拥有对象的所有权,即同一时间只能有一个unique_ptr
指向给定对象。它通过禁止拷贝语义,只支持移动语义来实现这一点。这意味着unique_ptr
的拥有者对对象有绝对的支配权,当unique_ptr
离开作用域时,它所指向的对象将被自动销毁。std::shared_ptr
则允许多个shared_ptr
实例共享同一个对象的所有权。它们通过内部引用计数来管理对象的生命周期,当最后一个shared_ptr
被销毁时,对象才会被删除。这种共享模型使得多个所有者可以共同管理对象的生命周期。
-
性能:
- 由于
std::unique_ptr
的所有权模型更为简单直接,它通常比std::shared_ptr
具有更好的性能。这是因为unique_ptr
不需要维护引用计数,从而减少了额外的内存开销和CPU使用。 std::shared_ptr
虽然提供了更灵活的所有权管理,但需要维护引用计数和可能的控制块,这可能会带来一定的性能开销。
- 由于
-
适用场景:
std::unique_ptr
适用于当你需要确保资源被唯一且高效地管理时,例如,当你确定资源在整个作用域内都被一个对象独占使用时。std::shared_ptr
则更适合于多个所有者需要共同管理资源的情况,例如,当多个对象需要访问和修改同一个资源时。
总的来说,选择使用std::unique_ptr
还是std::shared_ptr
取决于你的具体需求,包括资源的所有权模型、性能要求以及适用场景