c++ - 当返回可能在 C++ 中的堆栈上分配的成员时,最好的指针/引用类型是什么?
问题描述
所以为了说明我的问题,我举了一个例子:
#include <iostream>
using namespace std;
struct A
{
void doSomething (){
cout << "Something\n";
}
};
struct B
{
A a;
A *getA ()
{
return &a;
}
};
int
main ()
{
B *b = new B ();
A *a = b->getA ();
// POINT 1
if (nullptr != a)
{
a->doSomething ();
}
delete b;
b = nullptr;
// POINT 2
if (nullptr != a)
{
a->doSomething ();
}
return 0;
}
这在我的机器上编译和运行没有错误,但是如果你检查代码,在标记为“POINT 2”的注释后面的行上确实存在一个悬空指针的问题。
既然b
被删除了,那么a
现在是无效的(因为它被 dtor of 删除了b
)。
所以我可以使用共享指针来解决这个问题,但是a
即使在b
被删除之后也会保留周围的实例,而且我也无法a
在堆栈上分配。这是我想要避免的两件事。相反,我只是想知道是否a
仍然有效。
我也可以使用一个唯一的指针,但是我只能有一个实例,a
这也不是我想要的,我想要指针的多个副本a
。
那么是否有一些现有的指针/引用类型可以让我这样做?有什么理由说明这是一个好/坏主意吗?
解决方案
唯一想到的使用标准库的可行解决方案是使用std::weak_ptr() - 它允许检查对象有效性而不持有它的所有权。这伴随着价格 - 你必须保持对它的所有权std::shared_ptr
。虽然可以创建std::shared_ptr
一个具有自动存储持续时间和 noop 删除器的对象,但我只会在我真的需要时这样做,因为这样的方法容易出错并且违背了智能指针的目的。
推荐阅读
- c++ - 在 winuser.h 中注意到一些东西
- asp.net-core-webapi - 自定义自动生成的 Swagger 定义
- sql - 在表格中显示重复项
- google-cloud-platform - 如何在数据流模板中运行多个查询?
- flutter - Flutter Navigator 2.0 中 route.didPop(result) 何时等于 false
- python - Python Pandas 显示两个数据帧之间的位置变化
- postgresql - PSQL 将映射应用到数组
- wpf - 有时 ListView 中的图像会消失
- typescript - 从 TypeScript 4.1 中的参数计算其中一个键的返回类型
- python - 计算两个不同列中的单词并按行求和