Карта, вызывающая ошибку Сег.Как увеличить память? - PullRequest
1 голос
/ 06 июля 2011

У меня простой вопрос.У меня есть несколько файлов, один файл около 20000 строк.
Он имеет 5 полей, некоторые другие adt (векторы и списки), но они не вызывают segfault.Сама карта будет хранить значение ключа, эквивалентное примерно 1 на строку.Когда я добавлял карту в свой код, я мгновенно получал ошибку сегмента, я скопировал 5000 из 20000 строк и получил ошибку сегмента, затем 1000, и это сработало.

В Java есть способ увеличитьколичество виртуально выделенной памяти, есть ли способ сделать это в C ++?Я даже удалил элементы, так как они больше не используются, и я могу получить около 2000 строк, но не более.

Вот gdb:

(gdb) exec-file readin
(gdb) run
Starting program: /x/x/x/readin readin

Program exited normally.

valgrind:

HEAP SUMMARY:
==7948==     in use at exit: 0 bytes in 0 blocks
==7948==   total heap usage: 20,206 allocs, 20,206 frees, 2,661,509 bytes allocated
==7948== 
==7948== All heap blocks were freed -- no leaks are possible

код:

 ....
 Flow flw = endQueue.top();
  stringstream str1;
  stringstream str2;
  if (flw.getSrc() < flw.getDest()){
    str1 << flw.getSrc();
    str2 << flw.getDest();
    flw_src_dest = str1.str() + "-" + str2.str();
  } else {
    str1 << flw.getSrc();
    str2 << flw.getDest();
    flw_src_dest = str2.str() + "-" + str1.str();
  }    
while (int_start > flw.getEnd()){
  if(flw.getFlow() == 1){
    ava_bw[flw_src_dest] += 5.5;
  } else {
    ava_bw[flw_src_dest] += 2.5;
  }
  endQueue.pop();
} 

Ответы [ 4 ]

6 голосов
/ 06 июля 2011

Ошибка сегментации не обязательно означает, что у вас недостаточно памяти. На самом деле, в C ++ это крайне маловероятно : в этом случае вы обычно получаете bad_alloc или что-то подобное (если только вы не выгружаете все объекты в объекты с автоматическим хранением?

Скорее всего, в вашем коде есть ошибка повреждения памяти, из-за которой просто так случается, что будет заметным, только если у вас более определенного количества объектов.

В любом случае, решение проблем с памятью заключается не в том, чтобы слепо бросать больше памяти в программу.

Запустите ваш код через valgrind и отладчик, и посмотрите, в чем реальная проблема.

1 голос
/ 06 июля 2011

Будьте осторожны при удалении элементов из контейнера во время итерации по контейнеру.

for (pos = ava_bw.begin(); pos != ava_bw.end(); ++pos) {
    if (pos->second == INIT){
      ava_bw.erase(pos);
    }
  }

Я полагаю, что pos будет указывать на следующее значение, но затем ++pos будет продвигать его еще раз. Если erase(pos) приведет к pos, указывающему на ava_bw.end(), ++pos завершится неудачей.

Я знаю, если вы попробовали это с вектором, pos будет признан недействительным.

Редактировать

В цикле while вы делаете

while (int_start > flw.getEnd()){
   if(flw.getFlow() == 1){
      ava_bw[flw_src_dest] += 5.5;
   } else {
      ava_bw[flw_src_dest] += 2.5;
   }
   endQueue.pop();
}

Вам нужно снова сделать flw = endQueue.top().

1 голос
/ 06 июля 2011

Вообще говоря, в C \ C ++ максимальный объем доступной кучи не фиксируется при запуске программы - вы всегда можете выделить больше памяти, либо путем прямого использования new/malloc, либо с помощью контейнеров STL, таких как stl::list, который может сделать это самостоятельно.

0 голосов
/ 06 июля 2011

Я не думаю, что проблема в памяти, поскольку C ++ получает столько памяти, сколько требуется, даже загружая всю доступную память на вашем ПК.Посмотрите, если у вас delete что-то, к чему вы получите доступ позже.

...