【问题标题】:windows-linux g++ compiler memory errorwindows-linux g++编译器内存错误
【发布时间】:2013-03-13 22:49:07
【问题描述】:

我已经在 Windows VS 平台上编写了我的代码,当我编译它时没有错误。但是当我尝试使用 g++ 编译器在 linux 上编译它时,我得到了如下所示的错误:

[user@ssh ~]$ g++ main.cpp -o main
[user@ssh ~]$ ./main "data1_h1.txt" "data1_r1.txt" 3 "output1_S1"
*** glibc detected *** ./main: free(): invalid pointer: 0x00007fff795578b4 ***
======= Backtrace: =========
/lib64/libc.so.6[0x320ec716af]
/lib64/libc.so.6(cfree+0x4b)[0x320ec758db]
./main(__gxx_personality_v0+0x3b2)[0x4013da]
./main[0x401d4b]
/lib64/libc.so.6(__libc_start_main+0xf4)[0x320ec1d9c4]
./main(__gxx_personality_v0+0x71)[0x401099]
======= Memory map: ========
00400000-00405000 r-xp 00000000 00:16 18302619                           /users/lnxsrv1/ee/user/main
00604000-00605000 rw-p 00004000 00:16 18302619                           /users/lnxsrv1/ee/user/main
11159000-1117a000 rw-p 11159000 00:00 0 
320e800000-320e81c000 r-xp 00000000 fd:00 1585318                        /lib64/ld-2.5.so
320ea1c000-320ea1d000 r--p 0001c000 fd:00 1585318                        /lib64/ld-2.5.so
320ea1d000-320ea1e000 rw-p 0001d000 fd:00 1585318                        /lib64/ld-2.5.so
320ec00000-320ed4f000 r-xp 00000000 fd:00 1585379                        /lib64/libc-2.5.so
320ed4f000-320ef4f000 ---p 0014f000 fd:00 1585379                        /lib64/libc-2.5.so
320ef4f000-320ef53000 r--p 0014f000 fd:00 1585379                        /lib64/libc-2.5.so
320ef53000-320ef54000 rw-p 00153000 fd:00 1585379                        /lib64/libc-2.5.so
320ef54000-320ef59000 rw-p 320ef54000 00:00 0 
320f000000-320f082000 r-xp 00000000 fd:00 1585438                        /lib64/libm-2.5.so
320f082000-320f281000 ---p 00082000 fd:00 1585438                        /lib64/libm-2.5.so
320f281000-320f282000 r--p 00081000 fd:00 1585438                        /lib64/libm-2.5.so
320f282000-320f283000 rw-p 00082000 fd:00 1585438                        /lib64/libm-2.5.so
3212800000-321280d000 r-xp 00000000 fd:00 1585420                        /lib64/libgcc_s-4.1.2-20080825.so.1
321280d000-3212a0d000 ---p 0000d000 fd:00 1585420                        /lib64/libgcc_s-4.1.2-20080825.so.1
3212a0d000-3212a0e000 rw-p 0000d000 fd:00 1585420                        /lib64/libgcc_s-4.1.2-20080825.so.1
3217000000-32170e6000 r-xp 00000000 fd:00 782090                         /usr/lib64/libstdc++.so.6.0.8
32170e6000-32172e5000 ---p 000e6000 fd:00 782090                         /usr/lib64/libstdc++.so.6.0.8
32172e5000-32172eb000 r--p 000e5000 fd:00 782090                         /usr/lib64/libstdc++.so.6.0.8
32172eb000-32172ee000 rw-p 000eb000 fd:00 782090                         /usr/lib64/libstdc++.so.6.0.8
32172ee000-3217300000 rw-p 32172ee000 00:00 0 
2b43d24f0000-2b43d24f2000 rw-p 2b43d24f0000 00:00 0 
2b43d2508000-2b43d250a000 rw-p 2b43d2508000 00:00 0 
7fff79543000-7fff79558000 rw-p 7ffffffe9000 00:00 0                      [stack]
7fff795fd000-7fff79600000 r-xp 7fff795fd000 00:00 0                      [vdso]
ffffffffff600000-ffffffffffe00000 ---p 00000000 00:00 0                  [vsyscall]
Aborted 

我该如何解决这个错误?谢谢...

【问题讨论】:

  • 现在我们可以建议删除虚假的free()?如果您向我们展示代码,我们可能会提供更好的帮助。
  • 看起来您正在调用free 的内存地址已经被释放,或者一开始就从未使用过。如果您使用调试信息 (-g) 编译程序并在调试器 (gdb) 下运行程序,您可能可以获得更多信息。
  • 我已经分享了整个代码。
  • @JoshuaJeanThree:你没有分享整个代码。您应该提供您的main.cpp 的完整源代码以获得更多帮助

标签: linux windows memory g++


【解决方案1】:

您不会在编译时收到错误,而是在运行时。

我建议使用g++ -Wall -g 进行编译(并改进您的代码直到没有收到警告),然后使用valgrind 调试内存泄漏,当然还有通常的gdb 调试器。

【讨论】:

    【解决方案2】:

    您正在释放未分配的内存。第一个这样的例子是residentData

    您在 main 中将其分配为 argv[1],然后在其上调用 delete[],尽管您没有分配它。 (从技术上讲,您确实分配了它。您只是稍后将其替换为argv[1])。

    正如@Basile Starynkevitch 所建议的,您可能希望在 valgrind 下运行您的代码。它会查明许多内存错误。

    【讨论】:

    • 当我删除 delete[] residentData 和其他人时,问题就解决了。谢谢。
    猜你喜欢
    • 2012-08-05
    • 1970-01-01
    • 2015-02-16
    • 1970-01-01
    • 2023-01-27
    • 1970-01-01
    • 1970-01-01
    • 2013-07-21
    • 1970-01-01
    相关资源
    最近更新 更多