首页 > 解决方案 > 当返回可能在 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

那么是否有一些现有的指针/引用类型可以让我这样做?有什么理由说明这是一个好/坏主意吗?

标签: c++pointersreference

解决方案


唯一想到的使用标准库的可行解决方案是使用std::weak_ptr() - 它允许检查对象有效性而不持有它的所有权。这伴随着价格 - 你必须保持对它的所有权std::shared_ptr。虽然可以创建std::shared_ptr一个具有自动存储持续时间和 noop 删除器的对象,但我只会在我真的需要时这样做,因为这样的方法容易出错并且违背了智能指针的目的。


推荐阅读