#include <iostream>
#include <memory>
// 智能指针示例代码
int main() {
// 使用 std::unique_ptr 管理单个对象
std::unique_ptr<int> uniquePtr(new int(10));
// 或者使用 make_unique (C++14 及以上)
// auto uniquePtr = std::make_unique<int>(10);
std::cout << "Value managed by unique_ptr: " << *uniquePtr << std::endl;
// 使用 std::shared_ptr 管理多个所有者共享的对象
std::shared_ptr<int> sharedPtr1 = std::make_shared<int>(20);
{
std::shared_ptr<int> sharedPtr2 = sharedPtr1; // 共享所有权
std::cout << "Reference count after sharing: " << sharedPtr1.use_count() << std::endl;
} // sharedPtr2 在这里被销毁,引用计数减 1
std::cout << "Reference count after sharedPtr2 is destroyed: " << sharedPtr1.use_count() << std::endl;
// 使用 std::weak_ptr 避免循环引用
std::shared_ptr<int> sharedPtr3 = std::make_shared<int>(30);
std::weak_ptr<int> weakPtr = sharedPtr3;
if (std::shared_ptr<int> lockedPtr = weakPtr.lock()) { // 检查是否有效
std::cout << "Value managed by weak_ptr: " << *lockedPtr << std::endl;
} else {
std::cout << "weak_ptr has expired" << std::endl;
}
return 0;
}
std::unique_ptr
:
std::unique_ptr
是独占所有权的智能指针,它确保同一时间只有一个 unique_ptr
拥有该对象。当 unique_ptr
被销毁时,它所管理的对象也会被自动释放。new
创建对象并将其交给 unique_ptr
管理,或者使用 std::make_unique
(C++14 及以上版本)。std::shared_ptr
:
std::shared_ptr
是共享所有权的智能指针,允许多个 shared_ptr
同时拥有同一个对象。每个 shared_ptr
都会增加引用计数,当最后一个 shared_ptr
被销毁时,对象才会被释放。std::make_shared
创建 shared_ptr
是更高效的方式,因为它只涉及一次内存分配。std::weak_ptr
:
std::weak_ptr
不增加引用计数,用于解决 shared_ptr
可能导致的循环引用问题。它可以观察一个由 shared_ptr
管理的对象,但不会阻止对象被销毁。lock()
方法可以尝试获取一个有效的 shared_ptr
,如果对象已经被销毁,则返回空指针。通过这些智能指针,C++11 提供了更安全和高效的内存管理方式,减少了手动管理内存的风险。
上一篇:c++ map insert
下一篇:c++ string split
Laravel PHP 深圳智简公司。版权所有©2023-2043 LaravelPHP 粤ICP备2021048745号-3
Laravel 中文站