#c #vector #abort
#c #вектор #прервать
Вопрос:
Я написал программу, которая использует вектор и карту.
Когда я запускаю его, я получаю следующее сообщение об ошибке:
lru: malloc.c: 3552: munmap_chunk: ошибка утверждения `ret == 0′. Прервать
Что означает это сообщение об ошибке?
P.S.
Когда я запускаю свою программу с valgrind — она проходит без ‘abort’.
Вот мой код:
#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(amp;tr, sizeof(p2AddrTr), 1, stdin);
}
//size_t bytes = fread(amp;tr, sizeof(p2AddrTr),1, stdin);
//fread(amp;tr, sizeof(p2AddrTr),1, stdin); TODO here??
i = 0;
while((!feof(stdin)) amp;amp; (i<numAccesses)){
fread(amp;tr, sizeof(p2AddrTr),1, stdin);
//prints the address of the memory access
printf("lx ", 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);
}
Ответ №1:
Я вижу по крайней мере одну ошибку:
stack.erase(stack.begin() (j-1));
Если j равно 0, выполняется попытка стереть элемент до начала списка, что приводит к сбою.