1. 什么是 shared_ptr? shared_ptr 是C++ 标准库中的一种智能指针,用于自动管理动态分配对象的生命周期。通过引用计数机制,shared_ptr 能够确保当没有任何 shared_ptr 实例指向某个对象时,该对象会被自动释放,从而避免内存泄漏。 2. shared_ptr 如何管理对象的生命周期? shared_ptr 通过内部维护一个控制块来管理...
虽然shared_ptr 被称作“智能指针”,能够在没有人使用指针时自动的释放掉相应的内存,但是它却并不是万能的。事实上,shared_ptr 的默认“deleter”的适用范围相当有限,不可能处理C++程序开发中所有的内存指针,所幸它允许我们使用自己定义的 deleter,毕竟自己分配的内存,自己总该知道怎么释放吧? 到这里其实也能看出,所...
std::shared_ptr<int>ptr(new int[10],std::default_delete<int[]>()); 1. 2. 方法二:自定义释放规则 std::shared_ptr<int>ptr(new int[10],myDelete); void myDelete(int* p) { delete []p; } //也可以用lambda表达式一行写完,是一样的效果 std::shared_ptr<int>ptr(new int[10],[](in...
(const Person &p) { cout << "Person()拷贝构造" << endl; this->name = p.name; this->age = p.age; } const Person& getPerson() { return *this; } string name; int age; }; int main() { std::shared_ptr<Person> p2; { std::shared_ptr<Person> p1 = make_shared<Person>()...
我们可以照猫画虎的 , 在自己的类中 也写一个 create 方法. 来返回一个 shared_ptr . 来实现自动的内存释放: 1#include <iostream>2#include <memory>3usingnamespacestd;45classPerson {6public:7staticshared_ptr<Person> create(constchar*_name) {8returnshared_ptr<Person>(newPerson(_name));9}1011...
如下面这段代码,通过free()释放结构体,并不会导致智能指针自动释放,而使用delete释放结构体则可以正确地让智能指针释放。 这里涉及到两个小知识点: 1.shared_ptr的原理 每当智能指针对象被释放的时候,其析构函数会将所引用的对象的引用计数减1,如果减到0则释放所引用的对象。这也就意味着,shared_ptr 正常工作的...
C++的智能指针是一种特殊的指针类型,它能够自动管理内存资源,避免常见的内存泄漏和多次释放等问题。C++11引入了三种主要的智能指针:unique_ptr、shared_ptr和weak_ptr。 ①unique_ptr 在C++中,unique_ptr是一个智能指针(smart pointer)类模板,用于管理动态分配的内存资源,它提供了自动释放内存的功能。与原始指针相比,...
shared_ptr不用手动去释放资源,它会智能地在合适的时候去自动释放,这个对于C++内存泄漏和编程效率会有很大的提高; 以前我们常为忘记 delete,并且在多线程释放内存时很纠结 ,shared_ptr 可以方便的解决问题,因为它是引用计数和线程安全的。 写个简单的demo: ...
shared_ptr主动调用元素的析构std::shared_ptr在C++中是一个智能指针,它通过引用计数来管理对象的生命周期。当std::shared_ptr被销毁(例如离开作用域或被重新赋值)时,它会检查引用计数。如果引用计数为1,那么它会自动调用对象的析构函数,并释放对象。但如果引用计数大于1,那么它不会调用析构函数,而是减少引用计数...
释放所有权 当shared_ptr析构或主动释放所有权时,应将引用计数减 1,然后判断引用计数是否归零,如果归零,那么就释放指针指向的内存,此后将计数器指针置为空。需要注意的是,如果将计数器指针置为空,为了防止指针主动释放所有权之后计数器指针为空,导致判断计数是否归零,需要在判断计数归零前先判断计数指针是否为空。