对象在其成员函数执行时被删除?

Lak*_*aks 6 c++ memory-management object

我有指向单例类的指针对象。

线程 1:当前正在执行上述对象的成员函数。
线程 2:当对象的成员函数仍在线程 1 执行时删除上述对象。

正在执行成员函数的线程 1 会发生什么?执行是否会中途停止?

Mic*_*eyn 2

您很可能会遇到未定义的行为。线程 1 可能会遇到段错误,或者如果在删除对象后没有访问成员数据(并且没有进行虚拟函数调用),则线程 1 可能会继续正常运行。它还取决于删除后内存区域会发生什么情况。清零了吗?它是不可写/不可读取的吗?这一切都高度依赖于实现,也依赖于应用程序在重用数据区域来处理其他分配方面的数据需求。

指导原则是在对象的所有使用完成之前永远不要删除该对象。在某些例外情况下,成员函数会删除它们所操作的对象,以确保在删除点之后不再有成员访问。但除了少数确实证明删除成员合理的情况之外,不要这样做。

在您描述的多线程环境中,一定要协调对象生命周期与对象使用,否则您可能会很难调试(平台相关且不确定的)行为。

  • +1虽然我想说这是未定义的行为*iff*成员数据在删除后被访问。很容易将其想象为纯粹的竞争条件,但事实可能并非如此。据我们所知,线程 1 通过函数的前进与线程 2 的删除之间存在同步,在这种情况下,这种行为是明确定义的。 (2认同)