现代 C++ 中作为类成员的非拥有指针
Non-owning pointer as class member in modern c++
我一直在研究智能指针以及何时应该使用它们与原始指针。我的结论是,拥有指针的对象应该将该指针实例化为智能指针(unique_ptr/shared_ptr(。
然后,当将该指针传递给不需要所有权的各种函数/类时,传递一个原始指针(通过.get()
从智能指针获得(,但需要注意的是,原始指针发送到的函数/类永远不会超过拥有它的函数/类的范围。
这种理解正确吗?这对我来说似乎是有道理的,但是当我开始实施特定的例程时,我的信心就下降了。
下面的代码将更好地解释我的挂断当前在哪里。我有一个unique_ptr
s 的成员向量来Mesh
Scene
中的对象。然后,我传递所创建unique_ptr
的原始指针来实例化Actor
对象,最后将unique_ptr
移动到scene->meshes
向量中。
只要任何一个Actor
的范围永远不会超过拥有scene->meshes
要素的范围,Actor
作为成员拥有Mesh*
,这一事实难道不被视为不良做法吗?
#include <iostream>
#include <vector>
#include <memory>
class Mesh
{
public:
int vec = 1;
int ind = 2;
};
class Actor
{
private:
Mesh * mesh;
public:
Actor(Mesh* m) {
this->mesh = m;
}
};
class Scene
{
public:
// meshes will always outlive all instantiated actors
std::vector<std::unique_ptr<Mesh>> meshes;
std::vector<Actor> actors;
};
int main()
{
auto scene = std::make_unique<Scene>();
auto m1 = std::make_unique<Mesh>();
auto a1 = Actor(m1.get());
scene->meshes.push_back(std::move(m1));
auto m2 = std::make_unique<Mesh>();
auto a2 = Actor(m2.get());
scene->meshes.push_back(std::move(m2));
std::cout << scene->meshes.size();
std::cin.get();
return 0;
}
Actor将Mesh*作为成员的事实不被认为是不良做法,只要......
当然,这是一种代码气味。该类很容易被滥用。必须仔细记录构造函数在Actor的生存期内存储指针,以提醒用户维护尖网格的生存期。
在这种情况下,共享所有权会更安全。但是,如果性能开销很大,它并不总是最佳选择。
这是正确的,但非常丑陋。
您可以考虑使用第三个类来实现该关系,以及作用于此关系的任何操作。
某种控制器。
相关文章:
- 现代 C++ 中作为类成员的非拥有指针
- 谁拥有作为指向 Windows API 函数的指针传递的值?
- 在实现 std::vector 时,我必须拥有 end() 的"end"指针吗?
- 是否可以在标准弱指针之上实现非拥有"slightly smart"指针?
- C++移动拥有指针成员的构造函数
- 我怎么知道谁拥有某个指针
- 将原始指针向量清除给由独特指针拥有的对象
- 如何制作像shared_ptr这样的不拥有指针
- 是否可以拥有一个cv ::垫子,其中包含标量而不是标量的指针
- 拥有功能指针类型是什么意思
- 如果指针已经被删除,指针容器怎么能拥有指针的所有权
- C++ 明确库拥有指针
- 指针是否可能在没有任何数据副本的情况下被向量所拥有
- 将auto_ptr拥有的指针存储在导致崩溃的向量中
- C++11对unique_ptr的非拥有引用/指针
- 让shared_ptr拥有现有指针的更简单方法
- 正在检测对象是否为智能指针所拥有
- 如何在类中拥有函数指针
- 拥有一个具有原始指针访问器的unique_ptr成员是不好的做法吗?
- Rdbuf(..)返回一个指针——谁拥有所指向的缓冲区