【问题标题】:*** glibc detected *** and dynamic allocation issues - C++*** glibc 检测到 *** 和动态分配问题 - C++
【发布时间】:2014-10-16 11:33:40
【问题描述】:

我有两个我认为相关的问题。我正在尝试创建一个动态变量数组,然后访问该数组的不同特定成员。导致问题的代码段是:

        double *F_inertia, *F_drag, *F_KN;
        i = 0;
        F_inertia = new double[i];
        F_drag = new double[i];
        F_KN = new double[i];
        t = 0; 
        x = 0;

        for (z = 0; z >= -d; z = z-8) {
          F_drag[i] = ((0.5 * rho * Cd * Diam * ux * fabs(ux)));
          F_inertia[i] = (rho * Cm * Vol * ax); 
          F_KN[i] = (F_drag[i] + F_inertia[i])/1000;
          cout << i << "\t" << F_KN[i]<< endl;
          i++;
        }
               cout << F_KN[1] << endl;

        delete[] F_inertia;
        delete[] F_drag;
        delete[] F_KN;     

cout &lt;&lt; i &lt;&lt; "\t" &lt;&lt; F_KN[i]&lt;&lt; endl; 行正确输出值,并且所有值都正确写入文件(在代码前面)。但是,当我使用cout &lt;&lt; F_KN[9] &lt;&lt; endl; 行作为测试以查看该位置是否包含正确的值时,它会打印出一个 0,这与 for 循环中 i = 1tst 位置的值不同。 注意F_KN[5]-F_KN[8] 的值打印正确!只是没有任何较低的职位!我对此感到非常困惑!

其次,在代码编译运行后,在给我正确的值之后(除了第一个问题):

*** glibc detected *** ./monopile_deflection: free(): invalid next size (fast): 0x0000000001365260 ***
monopile_deflection: malloc.c:2451: sYSMALLOc: Assertion `(old_top == (((mbinptr) (((char *) &((av)->bins[((1) - 1) * 2])) - __builtin_offsetof (struct malloc_chunk, fd)))) && old_size == 0) || ((unsigned long) (old_size) >= (unsigned long)((((__builtin_offsetof (struct malloc_chunk, fd_nextsize))+((2 * (sizeof(size_t))) - 1)) & ~((2 * (sizeof(size_t))) - 1))) && ((old_top)->size & 0x1) && ((unsigned long)old_end & pagemask) == 0)' failed.
Aborted (core dumped)

从阅读中我知道这与错误地分配数组或尝试访问不存在的数组值有关,但我看不出问题出在哪里?

提前感谢您的任何帮助或建议!

【问题讨论】:

  • F_inertia = new double[i];i = 0; 感觉很奇怪。见stackoverflow.com/questions/1087042/…
  • 好的,尽管我收到了警告说我可能未初始化,但没有这个?我使用 i 只是为了跟踪 F_KN、F_inertia 和 F_drag 的每个值在数组中的哪个位置。
  • 那我不需要动态分配数组了吗?
  • @user3460758:fritzone 并没有建议您完全转储初始化;他建议修复它!

标签: c++ glibc dynamic-arrays


【解决方案1】:
i = 0;
F_inertia = new double[i];
F_drag = new double[i];
F_KN = new double[i];

当您稍后在程序中增加i 时,这些行分配的内存量不会神奇地改变。

因此,您分配了三个大小为零的数组,然后开始写入其不存在的元素。
你在那里损坏了很多内存。

要么:

  • 在分配前运行的单独循环中为 i 确定适当的值,或者
  • 使用std::vector&lt;double&gt;,它可以为您自动增长。

【讨论】:

  • 如果我要为 i 确定一个单独的值,我会使用:例如 F_inertia = new double[10] 吗?
猜你喜欢
  • 1970-01-01
  • 2017-05-07
  • 2011-11-15
  • 2022-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-13
  • 2012-05-02
相关资源
最近更新 更多