Keep It Simple, Stupid
阿新 • • 發佈:2019-01-11
碰到了一個記憶體釋放的問題,在進行某個複雜的操作時記憶體釋放後否則會造成崩潰。經過多方面調查發現此時根據就不能釋放記憶體(歷史原因),否則會造成不可預知的問題。所以我打算把要刪除的指標暫時儲存起來,並不立馬delete,等到10秒鐘還沒有操作的時候(稍微空閒)再把儲存的指標都銷燬掉。
後來順利的解決了問題,而且改動較小。
程式碼如下:
class DelayDestory : public QObject {
Q_OBJECT
public:
static DelayDestory* instance();
void deleteItem(TreeItem *item);
void deleteItem(const QList<TreeItem*> &items);
private slots:
void onTimer();
private:
DelayDestory();
private:
static const int INTERVAL_SECOND = 5;
static const int TIMEOUT_SECOND = 10;
QList<TreeItem*> items_;
class QTimer *timer_;
QMutex mutex_;
qint64 lastTime_;
};
DelayDestory* DelayDestory::instance()
{
static DelayDestory s_inst;
return &s_inst;
}
void DelayDestory::deleteItem(TreeItem *item)
{
if (!item) {
return;
}
lastTime_ = QDateTime::currentMSecsSinceEpoch();
QMutexLocker lock(&mutex_);
if (!items_.contains(item)) {
items_.push_back(item);
}
}
void DelayDestory::deleteItem(const QList<TreeItem*> &items)
{
if (items.isEmpty()) {
return;
}
lastTime_ = QDateTime::currentMSecsSinceEpoch();
QMutexLocker lock(&mutex_);
for (int i = 0; i < items.size(); i++) {
if (items[i] && !items_.contains(items[i])) {
items_.push_back(items[i]);
}
}
}
DelayDestory::DelayDestory()
: mutex_(QMutex::Recursive), lastTime_(0)
{
timer_ = new QTimer(this);
connect(timer_, SIGNAL(timeout()), this, SLOT(onTimer()));
timer_->start(INTERVAL_SECOND * 1000);
}
void DelayDestory::onTimer()
{
qint64 currentTime = QDateTime::currentMSecsSinceEpoch();
if (currentTime - lastTime_ >= TIMEOUT_SECOND * 1000 && !items_.isEmpty()) {
QList<TreeItem*> tempList;
{
QMutexLocker lock(&mutex_);
tempList = items_;
items_.clear();
}
qDebug() << "delete tree items, size:" << tempList.size();
for (int i = 0; i < tempList.size(); i++) {
delete tempList[i];
}
}
}