我正在从指向同一个类的指针构建一个对象。
class CA {
public:
CA(CA *p) { #1
//here 'this' is 0x7fffffffdfb0
}
CA(const CA& o){} #2
CA() { #3
// here all fine.
}
};
// create variable.
CA a(new CA());
当我想要创建一个如上所述的变量时,我可以看到在构造函数#1调用开始时,对象以this
设置为0x7fffffffdfb0
开始。构造函数#3没问题。
允许这样做吗?
我认为我的代码可能在对象的某个地方损坏但我不知道如何识别/识别谁在做这件事?
如果我使用valgrind
,则不会抱怨。
我在Cent Os中使用gcc。
答案 0 :(得分:1)
你的CA()
被new
调用,因此指向你的堆,而你的CA(CA *p)
在堆栈上实例化a
时被调用,因此指向一个记忆的不同部分。
所以,是的,这是正确的和预期的。
您的操作系统(和C ++运行时)完全可以自由设置指针的实际值。看看你的问题,你似乎正在使用x86_64 Linux,因此你正在使用一个虚拟内存系统,这意味着它可以将物理内存映射到(几乎)你的程序运行的虚拟地址空间中的任何一点。
实际上,0x7fffffffdfb0符合47位,因此位于内存空间的0.000763%的较低位置 - 因此实际上是非常非常小的值。