munmap_chunk: утверждение `ret == 0 'не выполнено

Я написал программу, которая использует вектор и карту.
Когда я запускаю ее, я получаю следующее сообщение об ошибке:
lru: malloc.c: 3552: munmap_chunk: Утверждение `ret == 0 'не удалось . Прервать

Что означает это сообщение об ошибке?

P.S.
Когда я запускаю свою программу с valgrind - она ​​проходит без «прерывания».

Вот мой код:

#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <vector>
#include <map>
#include "byutr.h"

using namespace std;

///////////////////////////////////////////
/* DEFINE ZONE */
///////////////////////////////////////////
#define NUM_OF_ARGS 4
 #define NUM_OF_DIFF_PAGES 100000

///////////////////////////////////////////
/* GLOBAL VARIABLES */
///////////////////////////////////////////

p2AddrTr tr;//a pre-defined struct
vector<uint32_t> stack;
vector<int> depths;
map<uint32_t, int> pages;
map<uint32_t, int>::iterator it;

int main(int argc, char **argv)
{
stack.reserve(NUM_OF_DIFF_PAGES);

FILE *ifp;//TODO remove!
//  unsigned long i;//TODO int OR unsigned long??
int i;
unsigned long pCnt =0;

if(argc != NUM_OF_ARGS)
{
    fprintf(stderr,"usage: lru <pageSize> <startAt> <numAccesses>\n");
    exit(1);
}

int pageSize = atoi(argv[1]);
int startAt = atoi(argv[2]);
int numAccesses = atoi(argv[3]);

int k;
//Skip some entries if needed
for(k=0;k< startAt;k++){
    fread(&tr, sizeof(p2AddrTr), 1, stdin);
}

//size_t bytes = fread(&tr, sizeof(p2AddrTr),1, stdin);
//fread(&tr, sizeof(p2AddrTr),1, stdin); TODO here??

i = 0;

while((!feof(stdin)) && (i<numAccesses)){

    fread(&tr, sizeof(p2AddrTr),1, stdin);

    //prints the address of the memory access
    printf("%08lx ", tr.addr);
    cout<<endl;
    int currAddr = (tr.addr)/pageSize;

    if(pages.find(currAddr) == pages.end()){//New page
        pCnt++;

        //insert the new page to the map
        pages.insert(pair<uint32_t, int>(currAddr,pCnt));

        //insert the new page to the 'stack'

        stack.push_back(currAddr);

    }
    else{//page already exists

        size_t j;
        //find the page in the stack
        for(j=0;j<stack.size();j++){
            if(stack[j] == currAddr){
                cout << "passed stack[j]"<<endl;
                depths.push_back(stack.size() - j);
                break;
            }
        }
        //move the page to the top of the stack
        stack.erase(stack.begin() + (j-1));
        stack.push_back(currAddr);
    }

    i++;
}

return (0);
}

person Zach    schedule 26.04.2011    source источник


Ответы (1)


Я вижу как минимум одну ошибку:

stack.erase(stack.begin() + (j-1));

Если j равно 0, это пытается стереть элемент перед началом списка, что приводит к сбою.

person LnxPrgr3    schedule 26.04.2011