【问题标题】:stl::vector fails to allocate memory 'randomly'stl::vector 无法“随机”分配内存
【发布时间】:2011-03-14 17:03:02
【问题描述】:

我有一个似乎很奇怪的问题,我很好奇是否有其他人看到过这种现象。我正在使用随机算法处理图形,因此每次运行的种子都不同。

  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

随机化会影响我从哪些节点开始执行 dijkstra 算法,但不会直接(我认为也不间接)影响分配的内存量。

有人见过这种“随机”分段错误问题吗?或者可能在代码中检查的错误?

谢谢!

【问题讨论】:

  • 啊,忘了说,这个系统上的软件有点过时了。 G++ 3.4.6 版,FreeBSD 6.3 版
  • 如果您正在使用“大部分”可用内存,您可能会看到内存碎片的结果,这将导致内存不足的情况,即使某些内存仍未分配,因为尽管在数字上有足够的空闲空间,没有足够大的空闲连续块来满足分配请求。
  • 您可能想尝试在 Valgrind 中运行您的程序,以确保您不会破坏幕后的任何内容。
  • @Tim malloc 不应该在内存不足的情况下崩溃。它应该返回 0。Valgrind 对我来说是个好主意。

标签: c++ stl random resize segmentation-fault


【解决方案1】:

当您在内存分配过程中偶尔出现神秘的段错误时,这通常意味着程序的某些其他部分正在写入已释放的内存、写出数组的末尾或以其他方式破坏了 malloc 的内部结构。这类问题可能很难调试。

Oli Charlesworth 建议您在valgrind(一种检测不良内存访问的工具)下运行程序。这是个好建议,您应该尝试一下。

【讨论】:

    猜你喜欢
    • 2011-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多