【问题标题】:Different address length when printing object pointer value using cout?使用 cout 打印对象指针值时地址长度不同?
【发布时间】:2013-10-28 14:57:05
【问题描述】:

我正在 64 位机器上运行 C++ 程序。该程序从不同的类动态创建对象。当我使用 cout 打印出指向这些对象的指针的值(不是取消引用)时,一些对象的地址是 48 位,而其他对象的地址是 28 位!我读过一些处理器目前只支持 48 位,但为什么在某些情况下我会得到 28 位的输出?这到底是什么意思?!

编辑:

这是一个大项目的一部分。因此,我将无法发布确切的代码。但这就是基本上正在发生的事情。我确实意识到需要删除对象以避免内存泄漏。

ClassA *pA = new ClassA();
ClassB *pB = new ClassB();
cout << "Address of ClassA object = " << pA << " , Address of ClassB object = " << pB << endl;

pA = new ClassA();
pB = new ClassB();
cout << "Address of ClassA object = " << pA << " , Address of ClassB object = " << pB << endl;

现在我得到的输出如下:

ClassA 对象的地址 = 0x7fcda0001150 ,ClassB 对象的地址 = 0x19f1160

ClassA 对象的地址 = 0x26c77c0 ,ClassB 对象的地址 = 0x1aba400

【问题讨论】:

  • 你能显示你的代码吗?听起来您没有将地址填充到适当的位数。
  • 您是如何确定指针大小为 28 位的? sizeof 以字节为单位,所以它要么给你 24 位要么 32 位。 here 是关于为什么指针只有 48 位大小的线程。
  • @RetiredNinja 我用示例代码更新了问题。
  • @DanielSaska 输出格式中可能省略了前导零,它实际上是 32 位。但是我不明白的是输出的不一致。
  • 问题解决了,你刚刚回答了你的问题......差不多。当我尝试使用int 指针时,我得到的是类似于 ClassA 对象的地址 = 0000002A902C8150 的东西。指针始终是 64 位的,但是当您以您所做的方式输出时,会省略前导零。有时你会得到指向内存的指针,这仍然很奇怪。

标签: c++ pointers 64-bit


【解决方案1】:

我猜,您刚刚观察到对象被分配在不同的内存区域中:

  1. 具有静态链接的对象通常位于具有程序代码的段旁边的数据段中,并且通常具有相对较小的值。
  2. 堆栈上的对象通常位于内存的远端,堆栈通常向下增长。因此,它们通常具有相当大的值。
  3. 在堆上分配的对象通常位于数据段和堆栈之间。根据内存分配决定分配内存的方式,该值可能从小开始,即刚好在数据段上方或相当大,即刚好在堆栈下方。

但是,系统如何真正布置其内存完全取决于系统。一些系统可能有完全不同的内存布局,堆栈向上增长等等。下面是一个演示这种效果的简单程序:

#include <iostream>

int main() 
{
    static int       a(0);
    static int const b(0);
    int              c(0);
    int*             d(new int(0));
    std::cout << "a=" << &a << '\n'
              << "b=" << &b << '\n'
              << "c=" << &c << '\n'
              << "d=" << d  << '\n';
    delete d;
}

在我的系统上,这个程序打印

a=0x103504064
b=0x103503f7c
c=0x7fff5c6fca8c
d=0x7f92204000e0

我猜,类似这种差异导致您假设指针不同,但只是格式化的值需要不同的位数:所有使用的 int*s 将具有相同的大小。

【讨论】:

    猜你喜欢
    • 2014-05-17
    • 1970-01-01
    • 2021-07-07
    • 2012-06-07
    • 1970-01-01
    • 1970-01-01
    • 2010-11-06
    • 1970-01-01
    相关资源
    最近更新 更多