以下是我们使用的示例。
class CustomThread
{
public:
CustomThread(const std::wstring &id1)
{
t = new test(id1);
}
~CustomThread();
void startThread() {
std::cout << "Do threading Operation here....." << std::endl;
}
private:
std::wstring id;
test *t;
};
int main()
{
for (int i = 1; i < 100; i++)
{
std::wstring id = L"1";
CustomThread *ct = new CustomThread(id);
boost::thread new_thread;
new_thread = boost::thread(& CustomThread::startThread, ct);
new_thread.detach();
}
// sleep for 100 second - to complete the thread task....
sleep(100);
return 0;
}
我创建了可拆卸线程,我想启动100个可拆卸线程。
在这里,我们正在进行new CustomThread
100次并分配内存。线程完成操作后会自动删除吗?
你可以用上面的例子指导如何释放分配的内存吗?
答案 0 :(得分:2)
这里有几个问题。首先,由于CustomThread
获取资源,因此需要遵循rule of three。
现在,让我们来看看你的设计。你动态地分配一个CustomThread
,这样它就不会在for循环结束时被销毁,并且会持续一段时间。这里的问题是你不知道何时删除该类,即使你做了,你仍然没有指针,以便在其上调用删除。您可以存储这些指针但仍然存在可能在线程完成之前删除对象的风险。我们需要做的是以某种方式将线程和对象耦合在一起,我们知道在线程完成运行后对象被销毁。我们可以使用辅助函数来完成此操作。如果我们有
void thread_runner(std::wstring param)
{
CustomThread ct(param);
ct.startThread();
}
然后我们可以在循环中调用此函数,如
for (int i = 1; i < 100; i++)
{
std::wstring id = L"1";
boost::thread new_thread;
new_thread = boost::thread(&thread_runner, id);
new_thread.detach();
}
现在自动清理CustomThread
对象,您不必担心调用delete
的位置和时间(假设您的类具有正确的析构函数或切换到RAII指针类型) )。