c++ - 智能指针(shared_ptr)
问题描述
我尝试学习如何使用智能指针。我使用了很长一段时间的普通指针,我认为我需要升级一下我的技能。
我做了一些研究,我了解智能指针的某些方面,但我尝试在一个清晰的项目中实现以了解智能指针是如何工作的。我尝试:
#include <iostream>
#include <array>
#include <memory>
class Entity
{
public:
Entity()
{
std::cout << "Entity called!" << std::endl;
}
~Entity()
{
std::cout << "Entity destroyed!" << std::endl;
}
void print() { std::cout << "Message!"; }
};
int main()
{
std::shared_ptr<int>f1(new int[100]);
f1.get()[1] = 1;
std::cout << f1.get()[1];
}
一切都好,消息它的打印。但是当我尝试时:
#include <iostream>
#include <array>
#include <memory>
class Entity
{
public:
Entity()
{
std::cout << "Entity called!" << std::endl;
}
~Entity()
{
std::cout << "Entity destroyed!" << std::endl;
}
void print() { std::cout << "Message!"; };
};
int main()
{
std::shared_ptr<Entity>f1(new Entity[100]);
f1.get()[1].print();
}
我收到此错误:[img] https://i.imgur.com/U30gTgC.png[/img]
下一个:
int main()
{
std::shared_ptr<Entity>f1(new Entity[100]);
(f1.get() + 1)->print();
}
同样的错误。
我尝试使用 std::make_shared:
#include <iostream>
#include <array>
#include <memory>
class Entity
{
public:
Entity()
{
std::cout << "Entity called!" << std::endl;
}
~Entity()
{
std::cout << "Entity destroyed!" << std::endl;
}
void print() { std::cout << "Message!"; };
};
int main()
{
std::shared_ptr<Entity>f1 = std::make_shared<Entity>();
f1->print();
}
一切安好。
我尝试使用 int 分配 continue 内存:
#include <iostream>
#include <array>
#include <memory>
class Entity
{
public:
Entity()
{
std::cout << "Entity called!" << std::endl;
}
~Entity()
{
std::cout << "Entity destroyed!" << std::endl;
}
void print() { std::cout << "Message!"; };
};
int main()
{
std::shared_ptr<int>f1 = std::make_shared<int>(100);
f1.get()[1] = 10;
std::cout << f1.get()[1];
}
消息已打印,输出:10 但错误: https ://i.imgur.com/UPu7VZo.png
我尝试另一种方式:
int main()
{
std::shared_ptr<int>f1 = std::make_shared<int>(100);
*(f1.get() +1) = 10;
std::cout << *(f1.get() + 1);
}
同样的错误。
std::shared_ptr<Entity[]>f1 = std::make_shared<Entity[]>(new Entity[100]);
我有错误...
我试图做这样的事情:
int main()
{
Entity* f1 = new Entity[100];
f1[0].print();
f1[1].print();
f1[2].print();
}
但我想使用智能指针。
对于 int,我想做一些这样的赋值:
int main()
{
int* f1 = new int[100];
f1[0] = 14;
f1[1] = 20;
f1[2] = 5;
}
我怎样才能用智能指针做这样的事情。我想使用: std::make_shared(new Entity[100]) 或类似的东西。
我可以尝试使用向量或数组之类的库,但我暂时不想使用这个库。我想暂时保持我的代码清晰。在我理解 100% 智能指针后,我将使用数组和向量库
解决方案
不是
std::shared_ptr<Entity[]> f1 = std::make_shared<Entity[]>(new Entity[100]);
但
std::shared_ptr<Entity[]> f1 = std::make_shared<Entity[]>(100);
甚至更简单
auto f1 = std::make_shared<Entity[]>(100);
使用make_shared
时不应使用new
. 的要点之一make_shared
是更有效地分配内存,如果您使用new
.
注意:数组形式make_shared
需要C++20。
推荐阅读
- python - Python 3 Django Rest Framework - 如何向这个 M-1-M 模型结构添加自定义管理器?
- linux - 如何在 awk 命令中将文本打印到文件?
- sql - tSQL 聚合函数和分组依据
- android - 从文件中读取值并放入 Flutter 中的 ListView
- internet-explorer - 登录网站并触发按钮
- ubuntu - 木偶代理没有启动,也没有证书请求,如何解决这个问题?
- algorithm - 寻找算法下界的决策树
- jboss6.x - 如何在 jboss eap 6.4 中设置像 X-XSS-Protection 这样的 http 标头?
- android - 如何在android studio中的特定时间之前设置闹钟?
- flutter - 如何减小按钮的宽度并将其放在中心