由于删除对象而导致的 Cpp 代码主线程冻结可以使用智能指针解决,也可以不使用智能指针来解决



我在我的代码中使用Qt和cpp,其中我创建了一个包含大量数据的类(假设RAM中~100MB(。在此类的析构函数中,我使用 while 循环删除此数据。问题是,当我调用此类主线程的删除时,它会冻结,因为它正忙于删除此数据。有人告诉我,智能指针是解决方案,因为它会自动释放内存,我不必显式调用 delete,但我怀疑智能指针也会只释放主线程中的内存。我想知道智能指针完成的删除是否在主线程中完成?

代码示例为:例子.h

#ifndef EXAMPLE_H
#define EXAMPLE_H
#include <iostream>
#include <qlist.h>
#include <memory>
#include <qdebug.h>
#include <QColor>
class Temp
{
private:
	QList<QColor *> *m_colorList;
public:
	Temp();
	void addList();
	~Temp();
};
#endif

示例.cpp

Temp::Temp()
{
	std::cout<<"Temp Constructor"<<std::endl;
	m_colorList = new QList<QColor *>;
}
Temp::~Temp()
{
	for(int i=0;i<m_colorList->size();i++)
		delete m_colorList->at(i);
	delete m_colorList;
}
void Temp::addList()
{
	QColor *color;
	for(int i =0; i<=2000000; i++)
	{
		color = new QColor(10,20,50,255);
		m_colorList->append(color);
	}
}
int main(int argc,char *argv)
{
	Temp *tempObj = new Temp();
	qDebug()<<"Adding list";
	tempObj->addList();
	qDebug()<<"List added";
	for(int i=0;i<10;i++)
		qDebug()<<i;
	qDebug()<<"deleting list";
	delete tempObj;
	tempObj=NULL;
	qDebug()<<"Memory deleted";
	getchar();
}

智能指针将自动为您删除对象。就这样。 在封面下,智能指针将为您调用 Delete - 无论如何都会执行析构函数。

除非已将其设置为在其他线程中执行,否则不会在其他线程中运行任何内容。虽然您可以在线程中进行此删除,但您将负责确保主线程中的任何内容在删除对象时都不会访问该对象 - 显然,如果您尝试在删除对象时(或之后(访问对象的一部分,那么您可能会崩溃您的程序。

相关内容

  • 没有找到相关文章

最新更新