-2
class B
{
public:
    B():a(0), b(0) { }
    B(int x):a(x), b(0) { }
private:
    int a;
    int b;
};

class A
{
public:
    A(B* ptr):pB(ptr) { }
    void modifypB() 
    { 
        delete pB; 
        pB = NULL; 
    }
    void printBSize() 
    { 
        if( pB != NULL )
            cout<<"pB pointing to Obj size:"<<sizeof(*pB)<<endl; 
        else
            cout<<"pB pointing to Obj size:"<<sizeof(*pB)<<endl; 
    }

private:
    B *pB;
};


void main()
{
    B *bObj = new B(10);
    cout<<"Size of bObj:"<<sizeof(*bObj)<<endl;

    A aObj(bObj);
    cout<<"Size of aObj:"<<sizeof(aObj)<<endl;

    cout<<"Before De-allocating: ";
    aObj.printBSize();
    aObj.modifypB();
    cout<<"After De-allocating: ";
    aObj.printBSize();
}

输出:

Size of bObj: 8
Size of aObj: 4
Before De-allocating: pB pointing to Obj size: 8
After De-allocating: pB pointing to Obj size: 8

为什么*pB即使在取消分配之后,大小也是 8?

4

2 回答 2

4

为什么 *pB 的大小是 8,即使在取消分配之后?

sizeof(*pB)在编译时根据*pB. 它的值不依赖pB于运行时的值。

您正在您的平台上的声明sizeof(B)的两个分支中打印。if8

于 2015-05-11T14:58:32.887 回答
3

sizeof(*p)为您提供编译器在编译时而不是在运行时确定的对象的大小。

尝试这个:

int main(void)
{
     std::string *string_pointer = 0;
     std::cout  << sizeof(*string_pointer) << std::endl;
     return 0;
}

这不会出现段错误,但会打印std::string-class 的大小。

于 2015-05-11T14:57:53.673 回答