我在64位Linux机器上创建了一个示例C ++程序,该机器在主机上作为Windows运行在VMware Player上。以下是类代码。
class operatorOverloadingTest{
private:
int age;
char *name;
public:
operatorOverloadingTest(int age){
this->age = age;
name = new char[10];
strncpy(name,"Indra",strlen("Indra"));
}
void displayDetails(){
cout<<"My Name :"<<name<<endl;
cout <<"My age: "<<age<<endl;
}
friend ostream & operator<<(ostream &out, const operatorOverloadingTest &myObj);
~operatorOverloadingTest(){
delete name;
cout<<" \nDestructor getting called"<<endl;
}
};
In my Main function, created object of class:
1. By using new operator.
2. Stack Object.
int main(){
operatorOverloadingTest *oOT = new operatorOverloadingTest(10);
operatorOverloadingTest oOT1(30);
据我所知,在64位机器上,内存地址以8字节表示。
当我使用GDB运行程序时,我看到以下地址:
p oOT
$1 = (operatorOverloadingTest *) 0x613c20
p &oOT
$2 = (operatorOverloadingTest **) 0x7fffffffe228
&(oOT1.age)
$7 = (int *) 0x7fffffffe210
(gdb) p &(oOT->age)
$8 = (int *) 0x613c20
我的问题是,为什么在堆中分配的对象显示32位地址表示,而堆栈上的对象(oOT1)显示64位地址表示,尽管我的操作系统是64位? (使用uname -a检查。)
答案 0 :(得分:1)
我的问题是,为什么在堆中分配的对象显示32位地址表示,而堆栈上的对象(oOT1)显示64位地址表示
当您查看0x1234
时,您知道该实体的至少 16位,但您无法判断它是否为16位, 32位或64位实体,因为GDB不会打印前导零。
如果您想知道某个程序实体有多大,请尝试:
(gdb) print sizeof(oOT)
(gdb) print sizeof(&ooT)