gpt4 book ai didi

c++ - 使用cout打印对象指针值时地址长度不同?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:25:52 25 4
gpt4 key购买 nike

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

现在我得到的输出如下:

Address of ClassA object = 0x7fcda0001150 , Address of ClassB object = 0x19f1160

Address of ClassA object = 0x26c77c0 , Address of ClassB object = 0x1aba400

最佳答案

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

  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* 将具有相同的尺寸。

关于c++ - 使用cout打印对象指针值时地址长度不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19472121/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com