C++ CoreDump的情况记录:
- 内存操作错误或失误,如对含容器的结构体使用memset、内存越界
- 栈溢出,一般发生在递归函数未收敛情况
- 线程访问了已经析构的对象,一般发生在多线程场景下
- windows场景下,std::mutex对象被持有线程lock()了两次()
- 注:linux场景下,第二次只会被阻塞(std::thread对象存在时,lock()操作才有效)
- 继承关系下,变量发生同名隐藏,同时遇到多态,被访问的变量为空指针
- 场景1:仅为子类成员分配了内存,但实际访问的父类同名成员
- 场景2:仅为父类成员分配了内存,但实际访问的子类同名成员
场景1举例:
class base{
int *m_sameVariable;
public:
base(int iNumber = 0)
: m_sameVariable(nullptr){
}
virtual ~base(){
delete m_sameVariable;
}
void publicFunc(){
m_sameFunction(); //调此函数就为模拟工程场景,而增加的复杂度,实际跟直接*m_sameVariable没区别的
}
virtual void DynamicCall(){
//do something
}
void m_sameFunction(int val = 10){
*m_sameVariable = val;
}
};
class child : public base{
int *m_sameVariable;
public:
child(int iNumber = 0)
: m_sameVariable(new int(iNumber)){
}
virtual ~child() override{
delete m_sameVariable;
}
virtual void DynamicCall(){
publicFunc();
}
void m_sameFunction(){
*m_sameVariable = 10;
}
};
int main(int argc, char *argv[])
{
base *pTest = new child(10);
pTest->DynamicCall();
return 0;
}
场景2举例:
class base
{
int *m_sameVariable;
public:
void SetData(int iNumber = 0){
m_sameVariable = new int(iNumber);
}
void publicFunc(){
DynamicCall();
}
virtual void DynamicCall(){
*m_sameVariable = 10;
}
};
class child : public base
{
int *m_sameVariable;
public:
void SetData(int iNumber = 0){
}
virtual void DynamicCall(){
*m_sameVariable = 10;
}
};
int main(int argc, char *argv[])
{
base *pTest = new child;
pTest->SetData(0);
pTest->publicFunc();
return 0;
}
实际工程中的代码比示例代码复杂得多,但核心也差不多是这样。这两种都是不熟悉名字查找规则与多态规则导致的。