c++ make_shared的使用及注意事项

news/2024/11/29 5:47:30/

在 C++11 中,可以使用 make_shared 函数来创建共享指针,它是一个模板函数,可以接受任何类型的参数,并返回一个指向该类型对象的共享指针。它可以将控制块和对象一起分配在堆上,从而避免了两次内存分配,并减少了引用计数的内存开销,相对于直接使用 newshared_ptr 的构造函数,make_shared 更为高效。

以下是 make_shared 函数的语法:

std::shared_ptr<T> make_shared< T >( Args&&... args );

其中,T 表示指向的类型,Args 是类型 T 的构造函数所需的参数列表,在调用时需要传递给构造函数。

下面是 make_shared 的使用方式:

例子1:

#include <memory>
#include <iostream>class MyClass {
public:MyClass() {}~MyClass() {}void func() {std::cout << "Hello world!" << std::endl;}
};int main() {std::shared_ptr<MyClass> ptr = std::make_shared<MyClass>();ptr->func();return 0;
}

在上面的代码中,我们使用 make_shared 函数来创建一个指向 MyClass 类对象的共享指针。需要注意的是,make_shared 参数必须是完整类型,因此需要提前定义 MyClass 类。接着,我们可以使用箭头运算符 -> 来调用 MyClass 中的成员函数。

例子2:

#include <iostream>
#include <memory>int main() {std::shared_ptr<std::string> ptr = std::make_shared<std::string>("hello world");std::cout << "ptr value: " << *ptr << std::endl;std::cout << "ptr use count: " << ptr.use_count() << std::endl;return 0;
}

运行:

book@ubuntu:~/Desktop/c++_study$ ./share 
ptr value: hello world
ptr use count: 1

除了上述基本用法之外,我们还需要注意以下几个细节:

1). make_shared 可以通过参数列表传递参数给对象的构造函数,例如:

std::shared_ptr<int> ptr = std::make_shared<int>(42);

2). 当某个对象不再被任何指针引用时,make_shared 会自动销毁该对象。如果对象同时还有其他资源(如文件或网络连接)需要释放,则需要在析构函数中处理。

3). 如果程序使用了多线程,不能在多个线程中共同访问同一个 shared_ptr 对象,需要使用 std::atomic<std::shared_ptr<T>>std::mutex 等机制来确保线程安全。

4). make_shared 函数可能会使得控制块和对象分配在同一块连续内存上,从而使得共享指针的内存占用更少。但是,如果使用 make_shared 来创建一个较大的对象,可能会增加堆分配的消耗。

总之,make_shared 是 C++11 提供的一种高效、安全的智能指针工厂函数,使用起来方便且实用。


http://www.ppmy.cn/news/382184.html

相关文章

什么是电子邮件地址?

电子邮件地址如真实生活中人们常用的信件一样&#xff0c;有收信人姓名&#xff0c;收信人地址等等。其结构是&#xff1a;用户名邮件服务器&#xff0c;用户名就是你在主机上使用的登录名。而后面的是邮局方服务计算机的标识&#xff08;域名&#xff09;&#xff0c;都是邮局…

电子邮箱地址怎么注册?什么邮箱最安全?

什么邮箱最安全&#xff1f;鉴于各个新闻信息泄露情况&#xff0c;一般使用者最关注的是电子邮件传输的加密性&#xff0c;收发速度。行业内邮箱日新月异&#xff0c;但电子邮箱地址怎么注册&#xff1f;什么邮箱最安全&#xff1f;都是需要考虑的&#xff1b;以TOMVIP 邮箱为例…

用户名电子邮件服务器名,电子邮件地址的用户名和邮件服务器名之间用什么符号...

电子邮件地址的用户名和邮件服务器名之间用用符号隔开。 邮箱有固定的通用格式&#xff0c;即userhost.domainnames&#xff0c;中文的格式即为&#xff1a;用户名主机名.域名。邮箱用户名不支持中文字符以及特殊的符号&#xff0c;仅可使用字母、数字、下划线。 例如&#xff…

电子邮箱地址如何注册?个人电子邮箱地址大全

每个人手里都有几个电子邮箱&#xff0c;像我有163、tom、qq等。在当时注册电子邮箱时就想着好记&#xff0c;注册不到短的就注册个长的吧&#xff0c;注册不到字母的就注册个字母数字的。但是当你手里有多个邮箱时&#xff0c;没有规律的邮箱账号是真的记不清了。 电子邮件地…

电子邮箱地址怎么写?

记得我毕业刚刚入职公司的时候&#xff0c;全是一个未脱稚气刚入职场的小白&#xff0c;公司的邮件系统都不会使用&#xff0c;连基本的电子邮箱地址怎么写都不知道&#xff0c;还好公司用的是TOM VIP邮箱&#xff0c;专为职场白领打造的商务邮箱&#xff0c;很快就掌握了公司邮…

独特的电子邮件地址

独特的电子邮件地址 每个 有效电子邮件地址 都由一个 本地名 和一个 域名 组成&#xff0c;以 ‘’ 符号分隔。除小写字母之外&#xff0c;电子邮件地址还可以含有一个或多个 ‘.’ 或 ‘’ 。 例如&#xff0c;在 aliceleetcode.com中&#xff0c; alice 是 本地名 &#xf…

电子邮件服务器是硬盘上的,电子邮件的地址、账号和邮件服务器分别是什么?...

(1)E-mail地址 在把一封信投入邮箱之前&#xff0c;要在信封上写上收信人的姓名和地址&#xff0c;邮局才会知道把信发到哪里。电子邮件同样也需要发信人给出正确的地址&#xff0c;才能将邮件送到目的地。在Internet的电子邮件系统中&#xff0c;每个用户都有一个邮件地址&…

获取Outlook中mail的from和To的Email地址。

在利用Outlook com组件编程的时候发现&#xff0c;Outlook中接受的邮件的发件人的Email地址不能正确的获得&#xff0c;他的属性里面只有一个SenderName属性&#xff0c;&#xff08;ol2003之前的版本).而网上的解决办法大多使用CDO。而且大部分代码使用VB写&#xff0c;迁移到…