2

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

4

1 回答 1

2

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

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

于 2013-10-19T23:51:34.753 回答