自动创建和处理共享指针向量

auto creation and handling of vector of shared pointers

基本上我正在学习处理共享指针,我想将这些指针收集到向量中以便更好地控制我的对象。理想情况下,每当我在另一个 class(矩形)中创建新的 "Line" 对象时,我都希望将这些指针添加到向量中。直到最近,我才手动启动共享指针并将其添加到一些运行良好的矢量。扩展了一些功能后,我现在向 class AddToList() 行添加了一个函数,它会自动添加到共享指针。问题是当我终止程序时,它崩溃了。否则它 运行 很好,永远没有任何缺陷。

也许代码有缺陷或者我做的可能不是很安全,

问题是我有一个矩形 class,其中包含一些线条对象。我没有明确删除任何矩形对象,但是当我终止程序时,它在最后一个实例中崩溃了。我相信我必须确保指向存储在向量中的对象的指针没有失效。我应该尝试在矩形析构函数中这样做吗?

我的代码本质上是这样的:

std::vector<std::shared_ptr<Line>> vectorOfLines;

Line::Line():
    {
    }

void gLine::AddToList()
        {
        std::shared_ptr<Line> pLine(this);
        vectorOfLines.push_back(pLine);
        }

然后我有一个矩形class,它的成员是一个线对象。创建了一个矩形对象,事情 运行 顺利地没有任何缺陷。只有当我终止程序时(按 ESC - 退出(0),它才会在最后崩溃。

您没有向我们展示您是如何创建 gLine 实例的,但问题很可能出在这一行:

std::shared_ptr<gLine> pLine(this);

通过将 this 传递给 std::shared_ptr,您让共享指针负责删除 this 指向的对象。除非你用 new gLine() 创建它,之后永远不要删除它,并且只调用一次 gLine::AddToList(),否则会有问题。

为了能够将 this 包装成智能指针,您有几个选择:

  1. std::enable_shared_from_this继承gLine,然后使用它的shared_from_this()成员。如果你走这条路,通常你会让你的 gLine 构造函数受保护,而是提供一个返回 std::shared_ptr<gLine>.
  2. 的静态工厂方法
  3. 使用 boost::intrusive_ptrboost::intrusive_ref_counter 而不是 std::shared_ptr。同样,您可能需要一个工厂方法和一个受保护的构造函数。

更好的是,重新设计您的代码,这样您就不需要将 this 包装到智能指针中。

Then I have a Rectangle class whose member is a line object.

听起来你正在这样做:

struct Rectangle {
  Line line;
};

Rectangle rect;
rect.line.AddToList();  // No!

此代码已完全损坏。它创建了一个拥有 rect.line 对象的 shared_ptr,但是因为它是 rect 的成员,所以它已经被 rect 拥有,并且会在 rect 时自动销毁] 被摧毁。当它不是动态分配时,试图让 shared_ptr 拥有(和删除)它是不必要的,而且明显是错误的。

您不需要 "better control" 作为其他对象成员的对象,因为语言和编译器已经很好地处理了这一点。