malloc是否创建了该类的新实例?

时间:2015-03-19 17:58:51

标签: c++ class object malloc new-operator

如果malloc不创建新对象但只分配原始内存,为什么我能通过指向此内存的指针访问类成员?

#include <iostream>
using namespace std;

const float PI = 3.141592654;

class Circle{
    float radius;
public:
    Circle(){
        cout << "Constructor called";
    }
    ~Circle(){
        cout << "Destructor called";
    }
    void Radius(){
        cout << "Enter radius: ";
        cin >> radius;
    }
    float Area(){
        return PI * radius * radius;
    }
    void Display(){
        cout << "The circle with radius " << radius
            << " units has area = " << this->Area() << " unit" << "\xFD\n";
    }
};

int main(){
    Circle *mCircle = (Circle *)malloc(sizeof(Circle));
    mCircle->Radius();
    mCircle->Display();
    return 0;
}

任何人都可以引用此信息来源: 在C ++中,规则规定在调用构造函数之前不会创建对象。

2 个答案:

答案 0 :(得分:3)

编译器会将对成员函数的调用转换为对静态函数的调用,并将隐含的this参数指向该对象。这意味着对象的内容(有效或无效)与是否进行调用无关。

如果方法是虚拟的,则会更改,因为vtable指针必须有效。构造函数将初始化vtable指针。 malloc 没有调用构造函数,它甚至不知道构造函数是什么 - 它是来自C的剩余行李。

请注意,这是标准指定的 ,但通常是如何实现的。

答案 1 :(得分:2)

您可以访问已分配但未初始化的内存,但无法对内容进行有效假设。成员函数独立于对象存在,只是在this指向未初始化的位置时调用它们。