我正在检查核心文件。我只是对可能导致这种情况的原因感到困惑。这是行为:
extern sampleclas* someobj;
void func()
{
someobj->MemFuncCall("This is a sample str");
}
我的崩溃在MemFuncCall中。但是当我检查核心文件时,someobj有一个地址,比如abc(这个地址被正确初始化而没有被破坏),这与函数stacktrace中的这个指针不同:sampleclass :: MemFuncCall(this = xyz,“This is a sample STR“)
我假设这个指针总是和someobj的地址相同,即abc应该总是等于xyz。 这两个地址有什么不同可能的情况??? Fyi,这个应用程序是单线程的。
答案 0 :(得分:2)
发布优化可能会使调试器中的内容显得非常奇怪。在调试模式(优化关闭)和repo。
中重新编译另一种可能的解释是,如果MemFuncCall的调用约定(或一般定义)是错误的(在编译的头之间和编译MemFuncCall时之间存在分歧)。不过,你必须努力解决这个问题。
答案 1 :(得分:1)
有可能。也许某种缓冲区溢出?也许调用约定(或一般的定义)对于MemFuncCall是错误的(你编译的头和编译MemFuncCall时不匹配。)
很难说。 但由于这是单线程,我会尝试遵循技术。应用程序重新运行时,应用程序中的内存布局通常是相同的。因此,在调试器下启动应用程序,立即停止它并在地址0xabc和0xxyz上放置两个内存断点。一旦有人修改了这个记忆,你很有可能遇到断点。可能比堆栈跟踪有帮助吗?
答案 2 :(得分:1)
在多重继承的情况下,this
指针可以与指向“真实”对象的指针不同:
struct A {
int a;
void fa() { std::cout << "A::this=" << this << std::endl; }
};
struct B {
int b;
void fb() { std::cout << "B::this=" << this << std::endl; }
};
struct C : A, B {
};
int main() {
C obj;
obj.fa();
obj.fb();
}
在obj.fa()
内,this
将指向A
的{{1}}部分,而在obj
内,它将指向fb()
部分。因此B
指针在不同方法中可能有所不同,也与this
不同。
作为崩溃的原因,可能是&obj
之前被删除且指针不再有效。
答案 3 :(得分:1)
由于指针someobj
是在外部定义的,因此编译单元之间可能存在一些不一致。尝试清理所有内容并重建项目
答案 4 :(得分:0)
我能想到的一件事是vtable腐败。