C++ - std::shared_ptr::get

C++ - std::shared_ptr::get

public member function - 公开成员函数
Defined in header <memory> - 定义于头文件 <memory>

1. std::shared_ptr::get

element_type* get() const noexcept;

Get pointer.
获取指针。

Returns the stored pointer.
返回存储的指针。

The stored pointer points to the object the shared_ptr object dereferences to, which is generally the same as its owned pointer.
存储的指针指向 shared_ptr 对象解引用的对象,通常与其拥有的指针相同。

The stored pointer (i.e., the pointer returned by this function) may not be the owned pointer (i.e., the pointer deleted on object destruction) if the shared_ptr object is an alias (i.e., alias-constructed objects and their copies).
如果 shared_ptr 对象是别名 (i.e., alias-constructed objects and their copies),则 stored pointer (i.e., the pointer returned by this function) 可能不是 owned pointer (i.e., the pointer deleted on object destruction)。

A shared_ptr may share ownership of an object while storing a pointer to another object. get() returns the stored pointer, not the managed pointer.
shared_ptr 可以在存储指向另一个对象的指针时共享对象的所有权。get() 返回存储的指针,而非被管理指针。

2. Parameters

none

3. Return value

The stored pointer.
element_type is a member type, alias of shared_ptr's template parameter (T).

4. Examples

4.1 std::shared_ptr::get

//============================================================================
// Name        : std::shared_ptr::get
// Author      : Yongqiang Cheng
// Version     : Version 1.0.0
// Copyright   : Copyright (c) 2019 Yongqiang Cheng
// Description : Hello World in C++, Ansi-style
//============================================================================

#include <iostream>
#include <memory>

int main()
{
	int* p = new int(10);
	std::shared_ptr<int> strong(p);

	if (strong.get() == p)
		std::cout << "strong and p point to the same location\n";

	// four ways of accessing the same address:
	std::cout << *strong.get() << "\n";
	std::cout << *(strong.get()) << "\n";
	std::cout << *strong << "\n";
	std::cout << *p << "\n";

	return 0;
}
strong and p point to the same location
10
10
10
10
请按任意键继续. . .
assignment [ə'saɪnmənt]:n. 任务,布置,赋值

4.2 std::shared_ptr::get

//============================================================================
// Name        : std::shared_ptr::get
// Author      : Yongqiang Cheng
// Version     : Version 1.0.0
// Copyright   : Copyright (c) 2019 Yongqiang Cheng
// Description : Hello World in C++, Ansi-style
//============================================================================

#include <iostream>
#include <memory>

void output(std::string msg, int const* pint)
{
	std::cout << msg << *pint << "\n";
}

int main()
{
	int* pint = new int(10);
	std::shared_ptr<int> pshared = std::make_shared<int>(9);

	output("Naked pointer: ", pint);
	// output("Shared pointer ", pshared); // 编译错误
	output("Shared pointer with get(): ", pshared.get());

	delete pint;

	return 0;
}

1>------ Build started: Project: yongqiangcheng, Configuration: Debug Win32 ------
1>  yongqiang.cpp
1>d:\visual_studio_workspace\yongqiangcheng\yongqiangcheng\yongqiang.cpp(14): error C2679: binary '<<': no operator found which takes a right-hand operand of type 'std::string' (or there is no acceptable conversion)
1>  d:\program files (x86)\microsoft visual studio 14.0\vc\include\ostream(495): note: could be 'std::basic_ostream<char,std::char_traits<char>> &std::basic_ostream<char,std::char_traits<char>>::operator <<(std::basic_streambuf<char,std::char_traits<char>> *)'
1>  d:\program files (x86)\microsoft visual studio 14.0\vc\include\ostream(475): note: or       'std::basic_ostream<char,std::char_traits<char>> &std::basic_ostream<char,std::char_traits<char>>::operator <<(const void *)'
1>  d:\program files (x86)\microsoft visual studio 14.0\vc\include\ostream(455): note: or       'std::basic_ostream<char,std::char_traits<char>> &std::basic_ostream<char,std::char_traits<char>>::operator <<(long double)'
1>  d:\program files (x86)\microsoft visual studio 14.0\vc\include\ostream(435): note: or       'std::basic_ostream<char,std::char_traits<char>> &std::basic_ostream<char,std::char_traits<char>>::operator <<(double)'
1>  d:\program files (x86)\microsoft visual studio 14.0\vc\include\ostream(415): note: or       'std::basic_ostream<char,std::char_traits<char>> &std::basic_ostream<char,std::char_traits<char>>::operator <<(float)'
1>  d:\program files (x86)\microsoft visual studio 14.0\vc\include\ostream(395): note: or       'std::basic_ostream<char,std::char_traits<char>> &std::basic_ostream<char,std::char_traits<char>>::operator <<(unsigned __int64)'
1>  d:\program files (x86)\microsoft visual studio 14.0\vc\include\ostream(375): note: or       'std::basic_ostream<char,std::char_traits<char>> &std::basic_ostream<char,std::char_traits<char>>::operator <<(__int64)'
1>  d:\program files (x86)\microsoft visual studio 14.0\vc\include\ostream(355): note: or       'std::basic_ostream<char,std::char_traits<char>> &std::basic_ostream<char,std::char_traits<char>>::operator <<(unsigned long)'
1>  d:\program files (x86)\microsoft visual studio 14.0\vc\include\ostream(335): note: or       'std::basic_ostream<char,std::char_traits<char>> &std::basic_ostream<char,std::char_traits<char>>::operator <<(long)'
1>  d:\program files (x86)\microsoft visual studio 14.0\vc\include\ostream(315): note: or       'std::basic_ostream<char,std::char_traits<char>> &std::basic_ostream<char,std::char_traits<char>>::operator <<(unsigned int)'
1>  d:\program files (x86)\microsoft visual studio 14.0\vc\include\ostream(290): note: or       'std::basic_ostream<char,std::char_traits<char>> &std::basic_ostream<char,std::char_traits<char>>::operator <<(int)'
1>  d:\program files (x86)\microsoft visual studio 14.0\vc\include\ostream(270): note: or       'std::basic_ostream<char,std::char_traits<char>> &std::basic_ostream<char,std::char_traits<char>>::operator <<(unsigned short)'
1>  d:\program files (x86)\microsoft visual studio 14.0\vc\include\ostream(236): note: or       'std::basic_ostream<char,std::char_traits<char>> &std::basic_ostream<char,std::char_traits<char>>::operator <<(short)'
1>  d:\program files (x86)\microsoft visual studio 14.0\vc\include\ostream(216): note: or       'std::basic_ostream<char,std::char_traits<char>> &std::basic_ostream<char,std::char_traits<char>>::operator <<(bool)'
1>  d:\program files (x86)\microsoft visual studio 14.0\vc\include\ostream(209): note: or       'std::basic_ostream<char,std::char_traits<char>> &std::basic_ostream<char,std::char_traits<char>>::operator <<(std::ios_base &(__cdecl *)(std::ios_base &))'
1>  d:\program files (x86)\microsoft visual studio 14.0\vc\include\ostream(202): note: or       'std::basic_ostream<char,std::char_traits<char>> &std::basic_ostream<char,std::char_traits<char>>::operator <<(std::basic_ios<char,std::char_traits<char>> &(__cdecl *)(std::basic_ios<char,std::char_traits<char>> &))'
1>  d:\program files (x86)\microsoft visual studio 14.0\vc\include\ostream(196): note: or       'std::basic_ostream<char,std::char_traits<char>> &std::basic_ostream<char,std::char_traits<char>>::operator <<(std::basic_ostream<char,std::char_traits<char>> &(__cdecl *)(std::basic_ostream<char,std::char_traits<char>> &))'
1>  d:\program files (x86)\microsoft visual studio 14.0\vc\include\ostream(692): note: or       'std::basic_ostream<char,std::char_traits<char>> &std::operator <<<char,std::char_traits<char>>(std::basic_ostream<char,std::char_traits<char>> &,const char *)'
1>  d:\program files (x86)\microsoft visual studio 14.0\vc\include\ostream(739): note: or       'std::basic_ostream<char,std::char_traits<char>> &std::operator <<<char,std::char_traits<char>>(std::basic_ostream<char,std::char_traits<char>> &,char)'
1>  d:\program files (x86)\microsoft visual studio 14.0\vc\include\ostream(777): note: or       'std::basic_ostream<char,std::char_traits<char>> &std::operator <<<std::char_traits<char>>(std::basic_ostream<char,std::char_traits<char>> &,const char *)'
1>  d:\program files (x86)\microsoft visual studio 14.0\vc\include\ostream(824): note: or       'std::basic_ostream<char,std::char_traits<char>> &std::operator <<<std::char_traits<char>>(std::basic_ostream<char,std::char_traits<char>> &,char)'
1>  d:\program files (x86)\microsoft visual studio 14.0\vc\include\ostream(950): note: or       'std::basic_ostream<char,std::char_traits<char>> &std::operator <<<std::char_traits<char>>(std::basic_ostream<char,std::char_traits<char>> &,const signed char *)'
1>  d:\program files (x86)\microsoft visual studio 14.0\vc\include\ostream(957): note: or       'std::basic_ostream<char,std::char_traits<char>> &std::operator <<<std::char_traits<char>>(std::basic_ostream<char,std::char_traits<char>> &,signed char)'
1>  d:\program files (x86)\microsoft visual studio 14.0\vc\include\ostream(964): note: or       'std::basic_ostream<char,std::char_traits<char>> &std::operator <<<std::char_traits<char>>(std::basic_ostream<char,std::char_traits<char>> &,const unsigned char *)'
1>  d:\program files (x86)\microsoft visual studio 14.0\vc\include\ostream(971): note: or       'std::basic_ostream<char,std::char_traits<char>> &std::operator <<<std::char_traits<char>>(std::basic_ostream<char,std::char_traits<char>> &,unsigned char)'
1>  d:\program files (x86)\microsoft visual studio 14.0\vc\include\ostream(981): note: or       'std::basic_ostream<char,std::char_traits<char>> &std::operator <<<char,std::char_traits<char>,std::string>(std::basic_ostream<char,std::char_traits<char>> &&,const _Ty &)'
1>          with
1>          [
1>              _Ty=std::string
1>          ]
1>  d:\program files (x86)\microsoft visual studio 14.0\vc\include\ostream(1019): note: or       'std::basic_ostream<char,std::char_traits<char>> &std::operator <<<char,std::char_traits<char>>(std::basic_ostream<char,std::char_traits<char>> &,const std::error_code &)'
1>  d:\visual_studio_workspace\yongqiangcheng\yongqiangcheng\yongqiang.cpp(14): note: while trying to match the argument list '(std::ostream, std::string)'
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

添加头文件 #include <string>

//============================================================================
// Name        : std::shared_ptr::get
// Author      : Yongqiang Cheng
// Version     : Version 1.0.0
// Copyright   : Copyright (c) 2019 Yongqiang Cheng
// Description : Hello World in C++, Ansi-style
//============================================================================

#include <iostream>
#include <memory>
#include <string>

void output(std::string msg, int const* pint)
{
	std::cout << msg << *pint << "\n";
}

int main()
{
	int* pint = new int(10);
	std::shared_ptr<int> pshared = std::make_shared<int>(9);

	output("Naked pointer: ", pint);
	// output("Shared pointer ", pshared); // 编译错误
	output("Shared pointer with get(): ", pshared.get());

	delete pint;

	return 0;
}

Naked pointer: 10
Shared pointer with get(): 9
请按任意键继续. . .

4.3 stored pointer - owned pointer

cannot convert std::shared_ptr<int> to const int*.

/*
============================================================================
Name        : yongqiang.cpp
Author      : Yongqiang Cheng
Version     : Version 1.0.0
Copyright   : Copyright (c) 2020 Yongqiang Cheng
Description : Hello World in C++, Ansi-style
============================================================================
*/

#include <iostream>
#include <memory>
#include <string>
#include <typeinfo>

void output(std::string msg, const int *pint) {
    std::cout << msg << *pint << "\n";
}

int main() {
    int *pint = new int(10);
    std::shared_ptr<int> pshared = std::make_shared<int>(9);

    std::cout << "data type: " << typeid(pint).name() << std::endl;
    std::cout << "data type (owned pointer): " << typeid(pshared).name() << std::endl;
    std::cout << "data type (stored pointer): " << typeid(pshared.get()).name() << std::endl;
    std::cout << "data: " << *pint << "\n";
    std::cout << "data (owned pointer): " << *pshared << "\n";
    std::cout << "data (stored pointer): " << *(pshared.get()) << "\n";

    output("Naked pointer: ", pint);
    output("Shared pointer ", pshared);
    output("Shared pointer with get(): ", pshared.get());

    delete pint;

    return 0;
}

====================[ Build | yongqiang | Debug ]===============================
/home/yongqiang/software/clion-2019.1.4/bin/cmake/linux/bin/cmake --build /home/yongqiang/CLionProjects/yongqiang/cmake-build-debug --target yongqiang -- -j 6
Scanning dependencies of target yongqiang
[ 50%] Building CXX object CMakeFiles/yongqiang.dir/main.cpp.o
/home/yongqiang/CLionProjects/yongqiang/main.cpp: In function ‘int main()’:
/home/yongqiang/CLionProjects/yongqiang/main.cpp:32:38: error: cannot convert ‘std::shared_ptr<int>’ to ‘const int*’ for argument ‘2’ to ‘void output(std::__cxx11::string, const int*)’
     output("Shared pointer ", pshared);
                                      ^
CMakeFiles/yongqiang.dir/build.make:62: recipe for target 'CMakeFiles/yongqiang.dir/main.cpp.o' failed
make[3]: *** [CMakeFiles/yongqiang.dir/main.cpp.o] Error 1
CMakeFiles/Makefile2:72: recipe for target 'CMakeFiles/yongqiang.dir/all' failed
make[2]: *** [CMakeFiles/yongqiang.dir/all] Error 2
CMakeFiles/Makefile2:84: recipe for target 'CMakeFiles/yongqiang.dir/rule' failed
make[1]: *** [CMakeFiles/yongqiang.dir/rule] Error 2
Makefile:118: recipe for target 'yongqiang' failed
make: *** [yongqiang] Error 2

/*
============================================================================
Name        : yongqiang.cpp
Author      : Yongqiang Cheng
Version     : Version 1.0.0
Copyright   : Copyright (c) 2020 Yongqiang Cheng
Description : Hello World in C++, Ansi-style
============================================================================
*/

#include <iostream>
#include <memory>
#include <string>
#include <typeinfo>

void output(std::string msg, const int *pint) {
    std::cout << msg << *pint << "\n";
}

int main() {
    int *pint = new int(10);
    std::shared_ptr<int> pshared = std::make_shared<int>(9);

    std::cout << "data type: " << typeid(pint).name() << std::endl;
    std::cout << "data type (owned pointer): " << typeid(pshared).name() << std::endl;
    std::cout << "data type (stored pointer): " << typeid(pshared.get()).name() << std::endl;
    std::cout << "data: " << *pint << "\n";
    std::cout << "data (owned pointer): " << *pshared << "\n";
    std::cout << "data (stored pointer): " << *(pshared.get()) << "\n";

    output("Naked pointer: ", pint);
//    output("Shared pointer ", pshared);
    output("Shared pointer with get(): ", pshared.get());

    delete pint;

    return 0;
}

Linux

/home/yongqiang/CLionProjects/yongqiang/cmake-build-debug/yongqiang
data type: Pi
data type (owned pointer): St10shared_ptrIiE
data type (stored pointer): Pi
data: 10
data (owned pointer): 9
data (stored pointer): 9
Naked pointer: 10
Shared pointer with get(): 9

Process finished with exit code 0

Windows

data type: int *
data type (owned pointer): class std::shared_ptr<int>
data type (stored pointer): int *
data: 10
data (owned pointer): 9
data (stored pointer): 9
Naked pointer: 10
Shared pointer with get(): 9
请按任意键继续. . .

References

http://www.cplusplus.com/reference/memory/shared_ptr/get/
https://en.cppreference.com/w/cpp/memory/shared_ptr/get

`std::enable_shared_from_this` 是一个模板类,其目的是为了解决在一个对象中保存 shared_ptr 的问题。它是 C++11 引入的一个特性。 在使用 `std::shared_ptr` 时,我们往往需要在对象中保存一个 `std::shared_ptr` 的副本,这样才能确保对象在使用完毕后不会被提前销毁。但是这种方式会导致一些问题,比如我们无法防止用户直接使用裸指针来操作对象,从而导致对象被提前销毁等问题。 这时候,我们可以使用 `std::enable_shared_from_this` 来解决这些问题。具体而言,我们需要继承 `std::enable_shared_from_this`,然后在对象中使用 `shared_from_this()` 方法来获取一个指向当前对象的 `std::shared_ptr`。 下面是一个示例代码: ```c++ #include <iostream> #include <memory> class MyClass : public std::enable_shared_from_this<MyClass> { public: std::shared_ptr<MyClass> get_shared_ptr() { return shared_from_this(); } }; int main() { std::shared_ptr<MyClass> p(new MyClass); std::shared_ptr<MyClass> q = p->get_shared_ptr(); std::cout << "p.use_count() = " << p.use_count() << std::endl; std::cout << "q.use_count() = " << q.use_count() << std::endl; return 0; } ``` 在这个示例中,我们定义了一个名为 `MyClass` 的类,并且继承了 `std::enable_shared_from_this`。然后,我们在类中定义了一个名为 `get_shared_ptr()` 的方法,该方法使用了 `shared_from_this()` 方法来获取一个指向当前对象的 `std::shared_ptr`。在 `main()` 函数中,我们先创建了一个 `std::shared_ptr` 对象 `p`,然后通过 `p` 调用 `get_shared_ptr()` 方法获取了一个指向同一个对象的 `std::shared_ptr` 对象 `q`。最后,我们输出了 `p` 和 `q` 的引用计数,可以看到它们的引用计数都是 2。 需要注意的是,在使用 `std::enable_shared_from_this` 时,我们需要确保对象已经被一个 `std::shared_ptr` 管理,否则使用 `shared_from_this()` 方法会导致程序崩溃。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Yongqiang Cheng

梦想不是浮躁,而是沉淀和积累。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值