测试对象是否未删除
Testing if object is not deleted
我的对象创建了一个线程,该线程在对象创建者的生命周期中修改对象创建者。问题是,线程在被破坏时不应该调用对象方法。我已经找到了解决这个问题的办法,我想知道它是否是最好的办法。
class A
{
shared_ptr<int> guard = make_shared<int>(0);
public:
weak_ptr<int> getGuard() { return guard; }
void method() {}
A()
{
thread([this]
{
const auto &guard = getGuard();
while(!guard.expired())
method();
});
}
};
while循环不是一种线程安全的方法,可以确保只有在guard
指向的对象仍然存在时才调用method
。原因是在对expired
的调用和对method
的调用之间,另一个线程可能会导致对象的破坏。
执行此检查的安全方法是尝试将弱指针提升为共享指针:
while (true)
{
shared_ptr<int> sp = getGuard().lock();
if (sp)
{
method();
}
else
{
return;
}
}
通过将弱指针提升为共享指针,调用代码在对method
的调用期间参与对象的所有权,确保在调用代码使用它时它不会被破坏。
您也未能连接或分离线程。从您的示例来看,您似乎想要分离它,以便A
的构造函数可以在线程完成执行之前退出。在这种情况下,您的代码应该是这样的:
thread([this]
{
...
}).detach();
如果您想确保对象在调用method
时不会被销毁,但在其他时候可以被销毁,那么您需要在对象本身保留一个weak_ptr
,并在调用方法时锁定它。类似于:
class A : std::enable_shared_from_this<A>
{
public:
void method() {}
A()
{
std::weak_ptr<A> self(shared_from_this());
thread([=self]
{
while (auto This = self.lock())
This->method();
}).detach();
}
};
这个对象现在只能通过make_shared
创建——尝试以任何其他方式创建都会导致未定义的行为,并且可能会崩溃。
相关文章:
- 是否需要删除包含对象的"pair"?
- 是否有C++编译器选项允许激进地删除所有函数调用,并将参数传递给具有空体的函数
- 是否删除在对象构造过程中创建的对象
- 是否可以使用if constexpr删除控制流语句
- 是否可以使用 C++ 中的模板减小删除代码大小
- 逐字节删除 void* 是否安全?
- 在对象指针上调用 Delete 是否会递归删除其动态分配的成员
- QFileSystemModel 对象是否会被删除?
- 编译器是否必须始终删除 try-catch 块(如果它被证明是非抛出的)
- 线程调用的函数对对象删除是否安全?
- 如何知道地图中的最后一个元素是否被删除?
- 在程序变得低效之前,允许多少新的[]和删除[]分配是否有限制?
- 文件模式标志"ios::app"是否用于删除文件(如果文件已存在)?
- 擦除是否删除 stl 无序列图元素使用的堆内存
- 是否可以使用函数指针数组来删除分支
- 删除[]是否可以与通用数组正常使用?如果是这样,为什么使用std :: vector ::擦除它会导致释放内存的错误
- 删除[]是否释放整个内存块
- 此删除是否会破坏每个数组对象
- g++空函数删除是否递归工作
- 删除 [] 是否等于每个元素删除.C++