roh*_*ren 6 c++ memory coredump
这是我的代码片段.
int main()
{
int *var = new int(6);
cout<<"Hello\n";
delete var;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当用mudflap编译时
$export MUDFLAP_OPTIONS="-print-leaks -mode-check"
$g++ test.cpp -fmudflap -lmudflap
$./a.out
Segmentation fault (core dumped)
Run Code Online (Sandbox Code Playgroud)
但是在没有mudflap选项的情况下进行编译时,它不会抛出核心转储.我是mudflap的新手.请告诉我是否以错误的方式使用mudflap.
供参考:
$uname -a
Linux localhost.localdomain 2.6.18-308.4.1.el5 #1 SMP Wed Mar 28 01:54:56 EDT 2012 x86_64 x86_64 x86_64 GNU/Linux
$g++ -v
Using built-in specs.
COLLECT_GCC=g++
COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-redhat-linux-gnu/4.7.3/lto-wrapper
Target: x86_64-redhat-linux-gnu
Configured with: /root/rohit/gcc-4.7.3/configure --prefix=/usr/
Thread model: posix
gcc version 4.7.3 (GCC)
Run Code Online (Sandbox Code Playgroud)
充满了coredump
核心由`./a.out'生成.
Program terminated with signal 11, Segmentation fault.
[New process 22176]
#0 0x0000003ca5e075c8 in ?? () from /lib64/libgcc_s.so.1
(gdb) bt ful
#0 0x0000003ca5e075c8 in ?? () from /lib64/libgcc_s.so.1
No symbol table info available.
#1 0x0000003ca5e0882b in _Unwind_Backtrace () from /lib64/libgcc_s.so.1
No symbol table info available.
#2 0x0000003c96ce5eb8 in backtrace () from /lib64/libc.so.6
No symbol table info available.
#3 0x00002b4acf58b417 in __mf_backtrace (symbols=0x6a51db8, guess_pc=0x2b4acf58d351, guess_omit_levels=2)
at /root/rohit/gcc-4.7.3/libmudflap/mf-runtime.c:1981
pc_array = (void **) 0x6a51e00
pc_array_size = 6
remaining_size = <value optimized out>
omitted_size = Unhandled dwarf expression opcode 0x9f
i = <value optimized out>
#4 0x0000000000000002 in ?? ()
No symbol table info available.
#5 0x0000000000000004 in ?? ()
No symbol table info available.
#6 0x0000000000000000 in ?? ()
No symbol table info available.
Run Code Online (Sandbox Code Playgroud)
小智 0
您的示例在我的编译器(x86 上的 Solaris)上按原样进行编译,但实际上,它非常简单,平台不应该产生任何影响。正如所写的,您的代码应该可以在任何地方编译和运行。这似乎是 MudFlap 的一些缺点。
我在当前环境中无法访问 MudFlap,但以下方法可能使您能够完全避免该问题:
#include <iostream>
#include <boost/shared_ptr.hpp>
using namespace std;
int main() {
boost::shared_ptr<int> var (new int(6));
cout << "Hello #" << *var << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我大胆猜测,“隐藏”智能指针初始化中的动态分配会欺骗 MudFlap。
我猜你的代码片段是对现实世界问题的简化。虽然我不知道为什么即使是简化版本也无法在您的环境中编译(它应该),但上述解决方案的优点是您无需担心删除指针,无论实际范围有多大。
话又说回来,也许 MudFlap 真的很聪明,试图强迫你使用 RAII。也许它在某处有一些配置设置,可以让您指定要使用和管理原始指针。无论如何,无论如何,使用智能指针方法都会对您有利。
尝试一下,让我们知道是否有帮助。