1. 程式人生 > >Keep It Simple, Stupid

Keep It Simple, Stupid

碰到了一個記憶體釋放的問題,在進行某個複雜的操作時記憶體釋放後否則會造成崩潰。經過多方面調查發現此時根據就不能釋放記憶體(歷史原因),否則會造成不可預知的問題。所以我打算把要刪除的指標暫時儲存起來,並不立馬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]; } } }