0

このエラーに関する多くの投稿を見てきました。しかし、メモリを動的に予約したり、デストラクタで何かを行ったりすることはありません。このプログラムは、オペレーティング システムでシリンダを選択するための SSJF アルゴリズムです。

IO という単純なクラスがあります。

class IO
{
    public:
            IO();
            IO(int,int);
            void setIO(int,int);
            ~IO();
            int trackNo;
            int arrival;
            int start;
            int end;
            bool finished;
};

クラスの実装は次のとおりです::

IO::IO(int arr, int tNum)
{
    this->arrival = arr;
    this->trackNo = tNum;
    this->start = 0;
    this->end = 0;
}    
IO::IO()
{

}

IO::~IO()
{

}    
void IO::setIO(int t1, int t2)
{
    this->trackNo = t1;
    this->arrival = t2;
}

最後に、メイン プログラムの一部を次に示します。

list<IO> myList;
....
myList.push_back(tmpIO); //Add to the list
...
list<IO> wt_list;

そして後で私はいくつかの操作をしようとしています。関係のない部分を一部削除しました。

    //list<IO>::iterator itMin;
    while(myList.size()>0)
    {
        //If it is the first input just get it
        if(f)
        {

            IO selected = myList.front();
            curr_time += selected.arrival + selected.trackNo;
            f=false;
            cout << selected.arrival<<endl;
            lastPos = selected.trackNo;
            myList.pop_front();

        }
        //Check if there is any item to add to queue
        while(myList.front().arrival <  curr_time)
        {
            wt_list.push_back(myList.front());
             myList.pop_front(); //Error is coming from this line
        }

        while(wt_list.size()>0)
        {

        }

エラーメッセージ:

malloc: * オブジェクト 0x10f68b3e0 のエラー: 解放されるポインターが割り当てられませんでした *デバッグするために malloc_error_break にブレークポイントを設定します

誰でも私を助けて、このエラーが発生する理由とそれをスキップする方法を説明できますか?

4

1 に答える 1

1

このエラーを再現するために思いつく最も簡単なコードは次のようになります。

#include <list>

int main()
{
    std::list<int> mylist;
    mylist.pop_front();
}

次のようにして、エラーを防ぐことができます。

#include <list>

int main()
{
    std::list<int> mylist;
    if (!mylist.empty())
    {
        mylist.pop_front();
    }
}

あなたが呼んでいる:

myList.pop_front();

...ループ内。これは、 も呼び出すループwhile内にあります。whilemyList.pop_front()

pop_front()コードをデバッグして、が呼び出され た回数を確認することをお勧めしますmylist。私のお金はそれ以上のものmylist.size()かかっているので、コメントで私の質問を(新たに強調して):

myList エラーがスローされたとき、アイテムはいくつありますか?

おそらく、最も簡単な修正は交換することです...

    //Check if there is any item to add to queue
    while(myList.front().arrival <  curr_time)
    {
        wt_list.push_back(myList.front());
         myList.pop_front(); //Error is coming from this line
    }

    while(wt_list.size()>0)
    {

    }

...と...

    while (!mylist.empty() && myList.front().arrival < curr_time)
    {
        wt_list.push_back(myList.front());
        myList.pop_front();
    }

    while (!wt_list.empty())
    {
    }

...しかし、提供されたスニペットからはわかりにくいです。

于 2013-10-23T16:42:56.447 に答える