这个程序为什么会敲蛋?

薛定谔之死猫 薛定谔之死猫 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
先不管存储泄漏,从C++语义上说这两个程序应该是一致的吧,怎么一个能预期运行,一个就敲蛋了呢,初学C++,帮忙解释下
程序一
#include <iostream>

#define interface class

using namespace std;

interface A{
public:
virtual void fun_a()=0;
};

interface B{
public:
virtual void fun_b()=0;
};

class C:public A,public B{
public:
void fun_a(){cout<<"function a"<<endl;}
void fun_b(){cout<<"function b"<<endl;}
~C(){cout<<"destructor"<<endl;}
};

int main(int argc,char **argv){
A *a=new C();
a->fun_a();
delete a;
return 0;
}


程序二
#include <iostream>

#define interface class

using namespace std;

interface A{
public:
virtual void fun_a()=0;
};

interface B{
public:
virtual void fun_b()=0;
};

class C:public A,public B{
public:
void fun_a(){cout<<"function a"<<endl;}
void fun_b(){cout<<"function b"<<endl;}
~C(){cout<<"destructor"<<endl;}
};

int main(int argc,char **argv){
B *b=new C();
b->fun_b();
delete b;
return 0;
}


[code=BatchFile]*** glibc detected *** ./a.out: free(): invalid pointer: 0x08f0600c ***
======= Backtrace: =========
/lib/tls/i686/cmov/libc.so.6[0xb7ec23f4]
/lib/tls/i686/cmov/libc.so.6(cfree+0x96)[0xb7ec4456]
/usr/lib/libstdc++.so.6(_ZdlPv+0x21)[0xb80a0031]
./a.out[0x80488f3]
/lib/tls/i686/cmov/libc.so.6(__libc_start_main+0xe5)[0xb7e69685]
./a.out[0x80487a1]
======= Memory map: ========
08048000-08049000 r-xp 00000000 08:01 843784 /home/luojianwen/programer/c/a.out
08049000-0804a000 r--p 00000000 08:01 843784 /home/luojianwen/programer/c/a.out
0804a000-0804b000 rw-p 00001000 08:01 843784 /home/luojianwen/programer/c/a.out
08f06000-08f27000 rw-p 08f06000 00:00 0 [heap]
b7d00000-b7d21000 rw-p b7d00000 00:00 0
b7d21000-b7e00000 ---p b7d21000 00:00 0
b7e52000-b7e53000 rw-p b7e52000 00:00 0
b7e53000-b7fab000 r-xp 00000000 08:01 1073300 /lib/tls/i686/cmov/libc-2.8.90.so
b7fab000-b7fad000 r--p 00158000 08:01 1073300 /lib/tls/i686/cmov/libc-2.8.90.so
b7fad000-b7fae000 rw-p 0015a000 08:01 1073300 /lib/tls/i686/cmov/libc-2.8.90.so
b7fae000-b7fb1000 rw-p b7fae000 00:00 0
b7fb1000-b7fbe000 r-xp 00000000 08:01 1073167 /lib/libgcc_s.so.1
b7fbe000-b7fbf000 r--p 0000c000 08:01 1073167 /lib/libgcc_s.so.1
b7fbf000-b7fc0000 rw-p 0000d000 08:01 1073167 /lib/libgcc_s.so.1
b7fc0000-b7fc1000 rw-p b7fc0000 00:00 0
b7fc1000-b7fe5000 r-xp 00000000 08:01 1073306 /lib/tls/i686/cmov/libm-2.8.90.so
b7fe5000-b7fe6000 r--p 00023000 08:01 1073306 /lib/tls/i686/cmov/libm-2.8.90.so
b7fe6000-b7fe7000 rw-p 00024000 08:01 1073306 /lib/tls/i686/cmov/libm-2.8.90.so
b7fe7000-b80ca000 r-xp 00000000 08:01 91052 /usr/lib/libstdc++.so.6.0.10
b80ca000-b80cb000 ---p 000e3000 08:01 91052 /usr/lib/libstdc++.so.6.0.10
b80cb000-b80cf000 r--p 000e3000 08:01 91052 /usr/lib/libstdc++.so.6.0.10
b80cf000-b80d0000 rw-p 000e7000 08:01 91052 /usr/lib/libstdc++.so.6.0.10
b80d0000-b80d6000 rw-p b80d0000 00:00 0
b80d9000-b80dc000 rw-p b80d9000 00:00 0
b80dc000-b80f6000 r-xp 00000000 08:01 1073168 /lib/ld-2.8.90.so
b80f6000-b80f7000 r-xp b80f6000 00:00 0 [vdso]
b80f7000-b80f8000 r--p 0001a000 08:01 1073168 /lib/ld-2.8.90.so
b80f8000-b80f9000 rw-p 0001b000 08:01 1073168 /lib/ld-2.8.90.so
bfae4000-bfaf9000 rw-p bffeb000 00:00 0 [stack]
Aborted[/code]
...全文
评论 7
收藏 已收藏
分享
返回顶部
薛定谔之死猫
C++ 语言 65,214 成员 250,514 内容