岳阳手机网站建设,亲子游网站怎么做,青岛抖音广告,合肥房产网签备案查询在C中#xff0c;std::shared_ptr是智能指针的一种#xff0c;它用于自动管理具有动态生命周期的对象。当std::shared_ptr的实例被销毁或重置时#xff0c;它所指向的对象#xff08;如果仍然存在#xff09;将被自动删除#xff08;调用delete#xff09;#xff0c;前…在C中std::shared_ptr是智能指针的一种它用于自动管理具有动态生命周期的对象。当std::shared_ptr的实例被销毁或重置时它所指向的对象如果仍然存在将被自动删除调用delete前提是这是最后一个指向该对象的std::shared_ptr实例。std::shared_ptr实现了所谓的“共享所有权”模式允许多个std::shared_ptr实例共同拥有同一个对象。
主要特性
自动内存管理当没有任何std::shared_ptr指向一个对象时该对象会被自动删除从而避免了内存泄漏。共享所有权多个std::shared_ptr可以指向同一个对象每个std::shared_ptr的实例都会维护一个内部计数器通常称为“控制块”该计数器表示有多少个std::shared_ptr实例正在指向该对象。安全拷贝和赋值当你拷贝或赋值一个std::shared_ptr时内部计数器会增加从而确保对象在拷贝或赋值后仍然被正确管理。弱引用通过std::weak_ptr可以实现对std::shared_ptr所管理对象的非拥有性观察即不会增加内部计数器的值。这有助于解决循环引用问题。
基本用法
#include memory
#include iostreamclass Example {
public:Example() { std::cout Example created\n; }~Example() { std::cout Example destroyed\n; }void sayHello() { std::cout Hello from Example\n; }
};int main() {// 创建一个指向Example的shared_ptrstd::shared_ptrExample ptr1 std::make_sharedExample();// 拷贝ptr1到ptr2两个shared_ptr都拥有对象std::shared_ptrExample ptr2 ptr1;// 访问对象ptr1-sayHello();// 当ptr1和ptr2都离开作用域时Example对象会被自动删除return 0;
}注意事项
循环引用如果两个std::shared_ptr相互指向对方它们将永远不会被销毁因为每个std::shared_ptr都认为对方还在使用其管理的对象。这可以通过引入std::weak_ptr来解决。性能虽然std::shared_ptr提供了方便的内存管理但相比于原始指针它在性能上可能会稍差一些因为它需要维护额外的控制块和进行原子操作。线程安全std::shared_ptr的拷贝和赋值是线程安全的但如果你同时从多个线程访问它所管理的对象则需要确保该对象的访问本身是线程安全的。