带有G 的破坏者con C (中止(核心倾倒))
Destructor con C++ with g++ (Aborted (core dumped))
我对带有g 的destructor遇到了一些问题,mingw上的工作正常...看来问题是当我随意销毁对象时,让程序销毁它们...
我编译此代码
#include <iostream>
#include <string.h>
using namespace std;
class Alumno{
public:
Alumno(string, int);
~Alumno();
void Print();
private:
string name;
int age;
};
Alumno::Alumno(string n="------", int e=0)
{
name = n;
age = e;
}
Alumno::~Alumno()
{
cout << "Done" << endl;
}
void Alumno::Print()
{
cout << "Name: " << name << endl;
cout << "Age: " << age << endl;
}
int main()
{
Alumno a;
a.Print();
cout << endl;
a.~Alumno();
cout << endl;
Alumno a2("john",20);
Alumno *ptrA=&a2;
a2.Print();
cout << endl;
a2.~Alumno();
ptrA->~Alumno();
Alumno a3("Ana");
a3.Print();
return 0;
}
我得到了回应,我不知道这是什么...
Name: ------
Age: 0
Done
Name: john
Age: 20
Done
Done
*** Error in `./a.out': double free or corruption (fasttop): 0x00000000022e8010 ***
======= Backtrace: =========
/lib64/libc.so.6[0x3ebde7d0b8]
/lib64/libstdc++.so.6(_ZNSsD1Ev+0x1f)[0x3ec82ba00f]
./a.out[0x400cd5]
./a.out[0x400e80]
/lib64/libc.so.6(__libc_start_main+0xf5)[0x3ebde21b45]
./a.out[0x400b79]
======= Memory map: ========
00400000-00402000 r-xp 00000000 fd:02 1581527 /home/ekiim/Documents/POO/a.out
00601000-00602000 r--p 00001000 fd:02 1581527 /home/ekiim/Documents/POO/a.out
00602000-00603000 rw-p 00002000 fd:02 1581527 /home/ekiim/Documents/POO/a.out
022e8000-02309000 rw-p 00000000 00:00 0 [heap]
3ebda00000-3ebda21000 r-xp 00000000 fd:00 1835646 /usr/lib64/ld-2.17.so
3ebdc20000-3ebdc21000 r--p 00020000 fd:00 1835646 /usr/lib64/ld-2.17.so
3ebdc21000-3ebdc22000 rw-p 00021000 fd:00 1835646 /usr/lib64/ld-2.17.so
3ebdc22000-3ebdc23000 rw-p 00000000 00:00 0
3ebde00000-3ebdfb6000 r-xp 00000000 fd:00 1835999 /usr/lib64/libc-2.17.so
3ebdfb6000-3ebe1b6000 ---p 001b6000 fd:00 1835999 /usr/lib64/libc-2.17.so
3ebe1b6000-3ebe1ba000 r--p 001b6000 fd:00 1835999 /usr/lib64/libc-2.17.so
3ebe1ba000-3ebe1bc000 rw-p 001ba000 fd:00 1835999 /usr/lib64/libc-2.17.so
3ebe1bc000-3ebe1c1000 rw-p 00000000 00:00 0
3ebee00000-3ebef01000 r-xp 00000000 fd:00 1839117 /usr/lib64/libm-2.17.so
3ebef01000-3ebf100000 ---p 00101000 fd:00 1839117 /usr/lib64/libm-2.17.so
3ebf100000-3ebf101000 r--p 00100000 fd:00 1839117 /usr/lib64/libm-2.17.so
3ebf101000-3ebf102000 rw-p 00101000 fd:00 1839117 /usr/lib64/libm-2.17.so
3ebfe00000-3ebfe15000 r-xp 00000000 fd:00 1843105 /usr/lib64/libgcc_s-4.8.2-20131212.so.1
3ebfe15000-3ec0014000 ---p 00015000 fd:00 1843105 /usr/lib64/libgcc_s-4.8.2-20131212.so.1
3ec0014000-3ec0015000 r--p 00014000 fd:00 1843105 /usr/lib64/libgcc_s-4.8.2-20131212.so.1
3ec0015000-3ec0016000 rw-p 00015000 fd:00 1843105 /usr/lib64/libgcc_s-4.8.2-20131212.so.1
3ec8200000-3ec82e6000 r-xp 00000000 fd:00 1839064 /usr/lib64/libstdc++.so.6.0.19
3ec82e6000-3ec84e5000 ---p 000e6000 fd:00 1839064 /usr/lib64/libstdc++.so.6.0.19
3ec84e5000-3ec84ed000 r--p 000e5000 fd:00 1839064 /usr/lib64/libstdc++.so.6.0.19
3ec84ed000-3ec84ef000 rw-p 000ed000 fd:00 1839064 /usr/lib64/libstdc++.so.6.0.19
3ec84ef000-3ec8504000 rw-p 00000000 00:00 0
7ff36bfa5000-7ff36bfa6000 rw-p 00000000 00:00 0
7ff36bfa6000-7ff36bfa8000 rw-p 00000000 00:00 0
7ff36bfa8000-7ff36bfa9000 rw-p 00000000 00:00 0
7ff36bfa9000-7ff36bfaa000 rw-p 00000000 00:00 0
7ff36bfcc000-7ff36bfcd000 rw-p 00000000 00:00 0
7ff36bfcd000-7ff36bfce000 rw-p 00000000 00:00 0
7ff36bfce000-7ff36bfcf000 rw-p 00000000 00:00 0
7fff4d4e7000-7fff4d508000 rw-p 00000000 00:00 0 [stack]
7fff4d5fe000-7fff4d600000 r-xp 00000000 00:00 0 [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall]
Aborted (core dumped)
有帮助吗?
您不应直接调用灾难函数(仅在某些罕见的特殊场合)。当功能返回并在堆栈上分配对象时,它被称为自动称为(您在做什么),或者在堆上调用delete
时。
正在发生的事情是〜Alumno()称为std :: string的破坏者。尽管校友不做任何自定义内存管理,但std :: string却做到了,所以第二次〜Alumno()被称为双重。
尝试运行此代码。它类似于您的代码中发生的事情,其中A类是校友的立场,B类是STD :: String。
#include <iostream>
class B
{
public:
~B() { std::cout << "~B()" << std::endl; }
};
class A
{
public:
~A() { std::cout << "~A()" << std::endl; }
B myB;
};
void foo (void)
{
A myA;
myA.~A();
}
int main(int argc, char * argv[])
{
foo();
system("pause");
return 0;
}
它应该产生此输出...
~A()
~B()
~A()
~B()
一般而言,这有两个大的东西...
1)不要手动调用驱动器(有一个例外,是当使用放置新时,它非常晦涩难懂)。
2)有一个很酷的工具,称为Linux的 valgrind 。我不知道您是否可以访问它,但是如果您确实有奇怪的内存问题时使用它。它倾向于照明。
相关文章:
- 如何找出GDB的SIGTRAP核心转储的根本原因
- C++映射分割错误(核心转储)
- 尽管测试成功,CppUnit测试核心仍被丢弃.为什么
- 在c++中初始化矩阵时出现分段错误(核心转储)
- C++核心准则 C35 对于接口类"A base class destructor should be either public and virtual, or protected and nonv
- MPI突然停止了对多个核心的操作
- 检测到堆栈粉碎:已终止 中止(核心已转储)
- 在基数排序中,我得到 munmap_chunk():无效指针和中止(核心转储).为什么?
- 双重释放或损坏(输出)和中止(核心转储)错误
- OpenCV 在窗口关闭时中止(核心转储)
- 堆栈粉碎中止<unknown>(核心转储)错误
- 在 wc 程序 c++ 中中止(核心转储)
- 从函数返回向量时C++中止(核心转储)
- 带有G 的破坏者con C (中止(核心倾倒))
- "./2"中的错误:free():无效指针:0x000000000096044c *** 已中止(核心转储)
- 在 PQconnectdb C++代码块中中止(核心转储)
- 在c++程序核心转储的反向竞争中,无限中止()
- 在使用 memcpy 填充动态 2d 数组后删除动态 2D 数组时中止(核心转储)
- 在抛出"std::invalid_argument"的实例后终止调用 what(): dataItem 已在树中 中止(核心转储)
- "./a.out"中的错误:双重释放或损坏(!prev):0x096fb008***中止(核心转储)