首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

从shared_ptr获得正常的ptr?

从shared_ptr获得正常的ptr的方法是使用get()成员函数。这个函数返回一个指向共享对象的原始指针,即ptr

示例代码:

代码语言:c++
复制
#include<iostream>
#include<memory>

int main() {
    std::shared_ptr<int> shared_ptr = std::make_shared<int>(42);
    int* ptr = shared_ptr.get();
    std::cout << "The value of the shared_ptr is: " << *ptr<< std::endl;
    return 0;
}

在这个示例中,我们创建了一个shared_ptr,指向一个整数值42。然后,我们使用get()函数获取原始指针ptr,并将其输出到控制台。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

C++智能指针unique_ptrshared_ptr和weak_ptr

reset:重置 shared_ptr,释放当前所管理对象并接管新对象。 release:释放对所管理对象控制权,并返回该指针裸指针。 swap:交换两个 shared_ptr 内容。...使用弱引用指针可以破坏循环引用,让所有的shared_ptr都能够正常析构并释放所管理内存,避免了潜在内存泄漏风险。...使用 lock() 获取 shared_ptr:要操作 weak_ptr 所观察对象,可以使用 lock() 函数获取一个有效 shared_ptr。...如果原始 shared_ptr 已经被释放,lock() 返回一个空 shared_ptr。...lock:获取一个有效 shared_ptr,用于操作所观察对象。如果原始 shared_ptr 已经被释放,返回一个空 shared_ptr

47420

shared_ptr是线程安全吗?

意思是说: shared_ptr引用计数本身是安全且无锁。 多线程环境下,调用不同shared_ptr实例成员函数是不需要额外同步手段 ?...结论:多个线程同时读同一个shared_ptr对象是线程安全, 但是如果是多个线程对同一个shared_ptr对象进行读和写,则需要加锁。 这里举个例子:怎么多线程调度执行顺序不确定性。 ?...1:shared_ptr 数据结构 shared_ptr 是引用计数型(reference counting)智能指针,几乎所有的实现都采用在堆(heap)上放个计数值(count)办法(除此之外理论上还有用循环链表办法...2:多线程无保护读写 shared_ptr 可能出现 race condition 考虑一个简单场景,有 3 个 shared_ptr 对象 x、g、n: shared_ptr...g(new Foo1); // 线程之间共享 shared_ptr shared_ptr x; // 线程 A 局部变量 shared_ptr n(new Foo2); // 线程

10.2K31

C++ 智能指针(unique_ptr, shared_ptr)源码分析

在博文https://blog.csdn.net/qq_27717921/article/details/82940519已经介绍了unique_ptrshared_ptr使用,但是这两类智能指针是如何做到管理指针呢...采用new返回指针初始化shared_ptr,调用构造函数,在堆上开辟一块存储空间,存放指向这块空间指针数量,这块空间地址初始化use_c. new int(2)返回指针用于初始化p. 2. shared_ptr...拷贝和赋值操作,更新use_count相关源码 auto q(p) //调用拷贝构造函数 auto q = p //调用 = 操作符重载 这两句代码涉及到shared_ptr拷贝构造函数...中release()只会在shared_ptr析构函数中被调用。...其他相关shared_ptr操作源码实现 std::size_t use_count() { return *use_c; } bool unique() const { return *use_c

2.5K32

当我们谈论shared_ptr线程安全性时,我们在谈论什么

自C++11起,shared_ptrboost转正进入标准库已有10年了。然而当C++程序员们在谈论shared_ptr是不是线程安全时候,还时常存在分歧。...你认为shared_ptr有哪些线程安全隐患? shared_ptr 可能线程安全隐患大概有如下几种,一是引用计数加减操作是否线程安全,二是shared_ptr修改指向时,是否线程安全。...另外shared_ptr不是一个类,而是一个类模板,所以对于shared_ptrT并发操作安全性,也会被纳入讨论范围。因此造成了探讨其线程安全性问题上复杂性。...也就是说对于引用计数这一变量存储,是在堆上,多个shared_ptr对象都指向同一个堆地址。在多线程环境下,管理同一个数据shared_ptr在进行计数增加或减少时候是线程安全吗?...尽管如此,由于shared_ptr使用上特殊性,所以我们有时也要将其纳入到shared_ptr相关线程安全问题讨论范围内。

1.1K30

std::shared_ptr 线程安全性 & 在多线程中使用注意事项

我们在讨论 std::shared_ptr 线程安全时,讨论是什么? 在讨论之前,我们先理清楚这样一个简单但却容易混淆逻辑。...std::shared_ptr 是个类模版,无法孤立存在,因此实际使用中,我们都是使用他具体模版类。...这里使用 std::shared_ptr 来举例,我们讨论时候,其实上是在讨论 std::shared_ptr 线程安全性,并不是 SomeType 线程安全性。...当然,对于不同裸指针 std::shared_ptr 实例,更是线程安全 这里 “成员函数” 指的是 std::shared_ptr 成员函数,比如 get ()、reset ()、 operrator...ThreadSanitizer: reported 4 warnings Terminated due to signal: ABORT TRAP (6) 错误信息中可以清晰地看到出现数据竞争,在

2.2K10

C++智能指针正确使用方式

shared_ptr代表是共享所有权,即多个shared_ptr可以共享同一块内存。 因此,语义上来看,shared_ptr是支持复制。...当一个shared_ptr离开作用域时,引用计数会-1。当引用计数为0时候,则delete内存。 同时,shared_ptr也支持移动。语义上来看,移动指的是所有权传递。...而w2获得了对象所有权,但因为此时w已不再持有对象,因此w2引用计数为1。 性能 内存占用高 shared_ptr内存占用是裸指针两倍。因为除了要管理一个裸指针外,还要维护一个引用计数。...(); auto pb = make_shared(); pa->b = pb; pb->a = pa; pa和pb存在着循环引用,根据shared_ptr引用计数原理,pa和pb都无法被正常释放...即: void func(Widget*); void func(const shared_ptr&) 实际上第一种裸指针方式可能更好,语义上更加清楚,函数也不用关心智能指针类型。

9.8K41

灵魂拷问std::enable_shared_from_this,揭秘实现原理

std::shared_ptr是一种允许多个指针共享对象所有权智能指针。然而,当一个对象需要获取对自身shared_ptr时,传统方法可能导致未定义行为。...std::shared_ptr基础知识 首先,我们回顾一下std::shared_ptr基础知识。它是一种智能指针,通过共享控制块方式安全地管理对象生命周期。...多个 shared_ptr 实例通过共享 控制块 结构来控制对象生命周期。 当使用原始指针构造或初始化 shared_ptr 时,会创建一个新控制块。...然而,有些情况下,shared_ptr 托管对象需要获得一个指向自己 shared_ptr。...公开继承 std::enable_shared_from_this 类可以通过调用方法 shared_from_this() 获得指向自己 shared_ptr

72210

C++智能指针原理和实现

;   3.析构函数中完成资源清理,可以保证资源正确初始化和释放;   4.如果对象是用声明方式在栈上创建局部对象,那么RAII机制就会正常工作,当离开作用域对象会自动销毁而调用析构函数释放资源。...2.1 auto_ptr auto_ptr是通过由 new 表达式获得对象,并在auto_ptr自身被销毁时删除该对象智能指针,它可用于为动态分配对象提供异常安全、传递动态分配对象所有权给函数和函数返回动态分配对象...声明:   template class shared_ptr;  成员函数:   (1) get:获得内部对象指针;   (2) swap:交换所管理对象;   (3) reset...weak_ptr可以从一个shared_ptr或者另一个weak_ptr对象构造,获得资源观测权。但weak_ptr没有共享资源,它构造不会引起指针引用计数增加。...weak_ptr可以使用一个非常重要成员函数lock(),被观测shared_ptr获得一个可用shared_ptr对象,从而操作资源。

51730

c++11&14-智能指针专题

1.1 std::shared_ptr std::shared_ptr包装了new操作符动态分配内存,可以自由拷贝复制,基本上是使用最多一个智能指针类型。...weak_ptr被设计为与shared_ptr共同工作,可以从一个shared_ptr或者另一个weak_ptr对象构造,获得资源观测权。...如要操作资源,则必须使用一个非常重要成员函数lock()被观测shared_ptr获得一个可用shared_ptr对象,从而操作资源。...TestWork() 2 ref a:2 ~TestB() ~TestA() 由以上代码运行结果我们可以看到: 所有的对象最后都能正常释放,不会存在上一个例子中内存没有释放问题; ptr_a和ptr_b...(); //w.expired()为true,返回空shared_ptr;否则返回指向wshared_ptr 1.3 std::unique_ptr uniqut_ptr是一种对资源具有排他性拥有权智能指针

62140

C++|智能指针模板类

所以为了避免这种情况出现,C++提供了智能指针模板类,专门用来自动管理内存。 ---- 智能指针初探 常见智能指针有auto_ptr、unique_ptrshared_ptr和weak_ptr。...<<"\n"; cin.get(); return 0; } 上面的程序执行出错原因是下面的语句将所有权转交film[2]转给了pwin,这导致film[2]不再引用该字符串。...pwin = films[2]; 如果auto_ptr放弃对象所有权后,再次使用film[2]指向字符串时,会发现这是一个空指针,并不存在正常引用,显然这是非法。...相对,如果我们修改上面的代码,使用shared_ptr来代替auto_ptr,那么程序将会正常运行。...使用new分配内存时,才能使用auto_ptrshared_ptr,当然,不使用new分配内存时也不可以使用这俩智能指针。

61010

智能指针小分析

我们期望有一种机制,它帮助我们管理系统获取而来资源,当我们不再使用该资源时,该机制能自动帮我们回收,避免了内存泄漏问题。智能指针就是这样一种资源回收机制。...这个条款提到了两个观点: 获得资源后立刻放进管理对象内。 管理对象运行析构函数确保资源被释放。 智能指针就是这样一种类。它们行为类似于指针,同样支持解引用* 或取成员->运算。...shared_ptr则允许多个指针指向同一个对象,而weak_ptr指向shared_ptr所管理对象,它是一种弱引用。 shared_ptr实现基于引用计数技术。...为什么要摒弃auto_ptr 上面说到auto_ptr是C++98提供智能指针,现在已经被摒弃,原因在于为了维护独占性,auto_ptr进行了不正常复制/赋值行为。...容器要求其元素可以有正常复制行为,因此,STL容器容不得auto_ptr

55320

C++智能指针

这时我们会想:当remodel这样函数终止(不管是正常终止,还是由于出现了异常而终止),函数体内局部变量都将自动栈内存中删除,因此指针ps占据内存将被释放,如果ps指向内存也被自动释放,那该有多好啊...shared_ptr和weak_ptr则是C+11准标准库Boost中引入两种智能指针。...但这里如果把auto_ptr换成shared_ptr或unique_ptr后,程序就不会崩溃,原因如下: 使用shared_ptr时运行正常,因为shared_ptr采用引用计数,pwin和films[...它最大作用在于协助shared_ptr工作,可获得资源观测权,像旁观者那样观测资源使用情况。...weak_ptr可以使用一个非常重要成员函数lock()被观测shared_ptr获得一个可用shared_ptr管理对象, 从而操作资源。

3.5K30

C++智能指针

shared_ptr允许多个指针指向同一个对象,unique_ptr是“独占”所指向对象。标准库还定义了一个名为weak_ptr伴随类,它是一种弱引用,指向shared_ptr所管理对象。...auto_ptr C++98智能指针模板,其定义了管理指针对象,可以将new获得(直接或间接获得)地址赋值给这种对象。当对象过期时,其析构函数会用delete来释放内存。...构造函数 shared_ptr sp ; //空shared_ptr,可以指向类型为T对象 shared_ptr sp1(new T()) ;//定义shared_ptr,同时指向类型为...,两个指针即可正常释放 weak_ptr 为了解决shared_ptr交叉循环引用无法释放问题。...同时weak_ptr 没有重载*和->但可以使用 lock 获得一个可用 shared_ptr 对象。 ---- 为了解决上面shared_ptr所出现问题。

40320

【C++】智能指针

堆中分配一块内存,用完后必须通过调用相应 free 或者 delete 删掉。...5. shared_ptr (1)shared_ptr 原理 C++11 中开始提供更靠谱并且支持拷贝 shared_ptr. shared_ptr 原理:是通过引用计数方式来实现多个 shared_ptr...,所以我们先画一下正常图理解一下: 此时,n2 智能指针对象中 _ptr 和 n1 智能指针对象中 _ptr 指向节点中 next 智能指针对象中 _ptr 都指向了同一个节点资源,所以该节点资源...,所以两个节点都被释放了,此时没有内存泄漏,是正常。...: T* _ptr; }; 上述代码在 shared_ptr 中增加了两个成员函数,其中 get() 是可以直接获得 shared_ptr 原生指针: int use_count

10010
领券