stl :: vector не может выделить память «случайно» - PullRequest
3 голосов
/ 14 марта 2011

У меня есть то, что кажется странной проблемой, и мне любопытно, видел ли кто-нибудь еще этот феномен. Я обрабатываю график с использованием случайного алгоритма, поэтому начальное число отличается для каждого прогона.

  unsigned int sseed = time(0);
  srand(sseed);

Хотя мой код использует достаточное количество памяти, ему не нужно использовать всю доступную память. Когда я запускаю свой код, 90 +% времени он работает без помех. Однако с определенными начальными значениями у меня возникают проблемы с памятью. Это происходит, когда я изменяю размер вектора CC:

vector<double> tmp_CC,CC;
tmp_CC.resize(SAMPLE_SIZE+1,0.0);
CC.resize(numberOfNodes+1,0.0); // line 1480

а я это вывод отладчика.

Program received signal SIGSEGV, Segmentation fault.
0x481d4cdb in malloc_pages (size=86016) at /.amd/distserv/share0/FreeBSD-6.3/src/lib/libc/stdlib/malloc.c:543
543 /.amd/distserv/share0/FreeBSD-6.3/src/lib/libc/stdlib/malloc.c: No such file or directory.
    in /.amd/distserv/share0/FreeBSD-6.3/src/lib/libc/stdlib/malloc.c
Current language:  auto; currently c
(gdb) backtrace
#0  0x481d4cdb in malloc_pages (size=86016) at /.amd/distserv/share0/FreeBSD-6.3/src/lib/libc/stdlib/malloc.c:543
#1  0x481d522f in imalloc (size=82504) at /.amd/distserv/share0/FreeBSD-6.3/src/lib/libc/stdlib/malloc.c:738
#2  0x481d5d7a in pubrealloc (ptr=0x0, size=82504, func=0x4825ba17 " in malloc():")
    at /.amd/distserv/share0/FreeBSD-6.3/src/lib/libc/stdlib/malloc.c:1126
#3  0x481d5e6b in malloc (size=82504) at /.amd/distserv/share0/FreeBSD-6.3/src/lib/libc/stdlib/malloc.c:1150
#4  0x48126e0d in operator new () from /usr/local/lib/gcc/i386-unknown-freebsd6.1/3.4.6/libstdc++.so.6
#5  0x08053b4f in __gnu_cxx::new_allocator<double>::allocate (this=0xbfbfe7e0, __n=10313) at new_allocator.h:81
#6  0x0805229a in std::_Vector_base<double, std::allocator<double> >::_M_allocate (this=0xbfbfe7e0, __n=10313) at stl_vector.h:113
#7  0x08052566 in std::vector<double, std::allocator<double> >::_M_fill_insert (this=0xbfbfe7e0, __position={_M_current = 0x0}, 
    __n=10313, __x=@0xbfbfe740) at vector.tcc:308
#8  0x080509f4 in std::vector<double, std::allocator<double> >::insert (this=0xbfbfe7e0, __position={_M_current = 0x0}, __n=10313, 
    __x=@0xbfbfe740) at stl_vector.h:612
#9  0x0804fa40 in std::vector<double, std::allocator<double> >::resize (this=0xbfbfe7e0, __new_size=10313, __x=@0xbfbfe740)
    at stl_vector.h:398
#10 0x0804da71 in calc_closeness_L () at SSDE.h:1480
#11 0x0804e8fd in main (argv=7, argc=0xbfbfeaec) at closeness.cpp:113

Рандомизация влияет на то, с каких узлов я начинаю выполнять алгоритм Дейкстры, но не оказывает прямого (или, я думаю, косвенного) влияния на объем выделяемой памяти.

Кто-нибудь когда-либо видел эту «случайную» проблему с ошибкой сегментации? Или возможные ошибки, чтобы проверить в коде?

Спасибо!

1 Ответ

3 голосов
/ 17 июня 2011

Если во время выделения памяти вы время от времени сталкиваетесь с загадочным segfault, это обычно означает, что какая-то другая часть программы выполняет запись в освобожденную память, запись конца массива или иное повреждение внутренних структур malloc.Проблемы такого рода могут быть очень трудными для отладки.

Оли Чарльзуортс предлагает вам запустить вашу программу под valgrind (инструментом, который обнаруживает неправильный доступ к памяти).Это хороший совет, и вы должны попробовать его.

...