使用cout打印对象指针值时的地址长度是否不同?

时间:2013-10-19 23:07:54

标签: c++ pointers 64-bit

我在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

1 个答案:

答案 0 :(得分:1)

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

  1. 具有静态链接的对象通常位于具有程序代码的段旁边的数据段中,并且通常具有相对较小的值。
  2. 堆栈上的对象通常位于内存的远端,堆栈通常向下生长。因此,它们通常具有相当大的价值。
  3. 在堆上分配的对象通常位于数据段和堆栈之间。根据内存分配决定分配内存的方式,该值可能从较小的数据开始,即刚刚高于数据段或相当大,即恰好低于堆栈。
  4. 系统如何真正布置内存完全取决于系统。有些系统可能具有完全不同的内存布局,堆栈向上增长等等。这是一个简单的程序,展示了这种效果:

    #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*都具有相同的大小。