Lak*_*aks 6 c++ memory-management object
我有指向单例类的指针对象。
线程 1:当前正在执行上述对象的成员函数。
线程 2:当对象的成员函数仍在线程 1 执行时删除上述对象。
正在执行成员函数的线程 1 会发生什么?执行是否会中途停止?
您很可能会遇到未定义的行为。线程 1 可能会遇到段错误,或者如果在删除对象后没有访问成员数据(并且没有进行虚拟函数调用),则线程 1 可能会继续正常运行。它还取决于删除后内存区域会发生什么情况。清零了吗?它是不可写/不可读取的吗?这一切都高度依赖于实现,也依赖于应用程序在重用数据区域来处理其他分配方面的数据需求。
指导原则是在对象的所有使用完成之前永远不要删除该对象。在某些例外情况下,成员函数会删除它们所操作的对象,以确保在删除点之后不再有成员访问。但除了少数确实证明删除成员合理的情况之外,不要这样做。
在您描述的多线程环境中,一定要协调对象生命周期与对象使用,否则您可能会很难调试(平台相关且不确定的)行为。
| 归档时间: |
|
| 查看次数: |
3392 次 |
| 最近记录: |