带内存分配的linux C ++问题

时间:2015-10-02 15:53:17

标签: c++ arrays linux memory-management heap-memory

我有几天的问题我可以解决。 我从HPUX获得了一些旧代码,我试图在Linux(RedHAT)上工作,出于某种原因,我不能使用超过2000个元素。

数组是一个结构,其中是定义

struct str_item {
         char   item [20];
         double value;
         char valueString [20];
  };

arry是班级的一部分

struct str_item **dpstr_valuesCalc;

在代码中

while (dpstr_valuesCalc[li_pos]) 
  {
  if (!strcmp (itemStr, dpstr_valuesCalc[li_pos]->item)) return 0;
  li_pos++;
  }
   dpstr_valuesCalc[li_pos] = new struct str_item;
   strcpy (dpstr_valuesCalc[li_pos]->item, itemStr);
   dpstr_valuesCalc[li_pos]->value = 0;
   strcpy (dpstr_valuesCalc [li_pos]->valueString, valueString);

并使用gdb

while (dpstr_valuesCalc[li_pos])
(gdb) p li_pos
 $38 = 2000  
 (gdb) p dpstr_valuesCalc[li_pos]  <-- 
 $39 = (str_item *) 0x0            <-- No new so it's 0
 (gdb) p dpstr_valuesCalc[li_pos+1]  <-- How this is something?
 $40 = (str_item *) 0x91             <-- Where this come from?
 dpstr_valuesCalc[li_pos] = new struct str_item;
 (gdb) p dpstr_valuesCalc[li_pos]   
 $41 = (str_item *) 0xaebd70   <-- new valide str_item
 (gdb) p dpstr_valuesCalc[li_pos+1]  
 $42 = (str_item *) 0x91             <-- Still where
 strcpy (dpstr_valuesCalc [li_pos]->item, itemStr);
 dpstr_valuesCalc[li_pos]->value = value;
 strcpy (dpstr_valuesCalc[li_pos]->valueString, "");
(gdb) p *dpstr_valuesCalc[li_pos]
$43 = {item = "Test",'\000' <repeats 15 times>, valor = 12, valorString = '\000' <repeats 19 times>}
(gdb) p *dpstr_valoresCalculados [li_pos+1]
Cannot access memory at address 0x91

以后的代码

while (dpstr_valuesCalc[li_pos]) <-- in dpstr_valuesCalc [2001] is valid because (str_item *) 0x91
So it goes to 
{
  if (!strcmp (itemStr, dpstr_valuesCalc[li_pos]->item)) return 0;
And 
Program received signal SIGSEGV, Segmentation fault.
__strcmp_sse2 () at ../sysdeps/x86_64/strcmp.S:213
 movlpd  (%rsi), %xmm2

它似乎是一个内存问题,也许没有更多堆? 但是如果我理解malloc_stats还有内存, system bytes-in use bytes,它的权利?

(gdb) call malloc_stats()
Arena 0:
system bytes     =    1200128
in use bytes     =    1195040
Total (incl. mmap):
system bytes     =    1814528
in use bytes     =    1809440
max mmap regions =          3
max mmap bytes   =     614400

关于SO,我认为我没有问题

ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 31192
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200  
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 4096
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

也许链接器定义?必须使用-fPIC?

我读了这个

  1. 数组索引
  2. 这种错误与其他错误分开,以便更好地构建帐户,因为使用方括号在数组中进行索引只是之前观察到的地址算法的不同记录。

    用C语言编程然后C ++已经形成了在以下类型的结构中使用int / unsigned类型变量的做法:

    unsigned Index = 0;
    while (MyBigNumberField[Index] != id)
     Index++;
    

    但时间过去了,一切都在变化。现在是时候说了 - 不要再这样了!使用memsize类型索引(大型)数组。

    给定代码不会处理64位程序中包含多于UINT_MAX项的数组。在使用UNIT_MAX索引访问项目后,将发生Index变量的溢出,并且我们将获得无限循环。

    为了说服你完全只需要使用memsize类型进行索引以及在地址算术的表达式中,我将给出最后一个例子

    http://www.viva64.com/en/a/0004/#ID0E65AM

    这可以通过我的问题吗?

    感谢任何帮助

0 个答案:

没有答案