自动创建和处理共享指针向量
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
包装成智能指针,您有几个选择:
- 从
std::enable_shared_from_this
继承gLine
,然后使用它的shared_from_this()
成员。如果你走这条路,通常你会让你的 gLine
构造函数受保护,而是提供一个返回 std::shared_ptr<gLine>
. 的静态工厂方法
- 使用
boost::intrusive_ptr
和 boost::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" 作为其他对象成员的对象,因为语言和编译器已经很好地处理了这一点。
基本上我正在学习处理共享指针,我想将这些指针收集到向量中以便更好地控制我的对象。理想情况下,每当我在另一个 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
包装成智能指针,您有几个选择:
- 从
std::enable_shared_from_this
继承gLine
,然后使用它的shared_from_this()
成员。如果你走这条路,通常你会让你的gLine
构造函数受保护,而是提供一个返回std::shared_ptr<gLine>
. 的静态工厂方法
- 使用
boost::intrusive_ptr
和boost::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" 作为其他对象成员的对象,因为语言和编译器已经很好地处理了这一点。