如何在施工期间发现腐败现象

时间:2014-03-05 23:39:27

标签: c++ pointers constructor this

我正在从指向同一个类的指针构建一个对象。

 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。

1 个答案:

答案 0 :(得分:1)

你的CA()new调用,因此指向你的堆,而你的CA(CA *p)在堆栈上实例化a时被调用,因此指向一个记忆的不同部分。

所以,是的,这是正确的和预期的。

进一步说明

您的操作系统(和C ++运行时)完全可以自由设置指针的实际值。看看你的问题,你似乎正在使用x86_64 Linux,因此你正在使用一个虚拟内存系统,这意味着它可以将物理内存映射到(几乎)你的程序运行的虚拟地址空间中的任何一点。

实际上,0x7fffffffdfb0符合47位,因此位于内存空间的0.000763%的较低位置 - 因此实际上是非常非常小的值。