针对损坏的指针分配的“最佳”调试策略

问题描述 投票:0回答:1

我有一个我认为是类类型“A”的类对象,我希望 A 没有损坏(我知道类模板,我只是还不能 100% 确定模板参数)。

现在,在追踪错误时,我在代码中的某处进行了以下测试:

A* p = &x;
std::cout << "&x : " << &x << "\n";
std::cout << " p : " <<  p << "\n";

打印的地址匹配。

我的印象是,无论类型如何,指针赋值运算符通常都应该有效。我验证了整个代码库中的任何地方都没有 & 符号运算符的自定义定义,因此我假设该现象不是由于 & 符号过载造成的。

然后我也开始注释掉类模板中的所有内容,因此 A 实际上是空的。

为了测试编译器错误,我尝试使用 G++ 13 和 Clang++ 17。两者在可执行文件中呈现完全相同的行为:两次都会打印两个不同的地址(在带有 0x 的 g++ 中,在 clang 中全部大写)。

GPT 建议将“&”符号过载、内存损坏和编译器/硬件问题作为可能的根本原因。鉴于我找不到任何与号重载,我的类模板现在是空的,我还没有尝试过的是不同的硬件:进一步调试错误的最佳方法是什么?

此时我可能会继续用虚拟类替换该类,然后回滚我认为正在使用的确切模板列表的所有属性和成员。

c++ debugging pointer-arithmetic
1个回答
0
投票

我不知道从派生到基址的指针分配可能会导致地址偏移,正如我现在从 user4581301 的评论中了解到的那样。详情请看这里:

stackoverflow.com/q/31204335/4581301

虽然我知道继承顺序决定了内存中的堆栈,但我不知道虚拟基指针不会指向派生对象的开头,因为我暗示这是语言在运行时的方式确定虚拟会员是否需要向上转型。

© www.soinside.com 2019 - 2024. All rights reserved.