malloc 是不是创建类的新实例? [复制]

Posted

技术标签:

【中文标题】malloc 是不是创建类的新实例? [复制]【英文标题】:Does malloc create a new instance of the class or not? [duplicate]malloc 是否创建类的新实例? [复制] 【发布时间】:2015-05-22 23:50:59 【问题描述】:

如果 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++ 中,规则规定在调用构造函数之前不会创建对象。

【问题讨论】:

您使用malloc() 而不是new() 有什么具体原因吗?不,malloc() 没有正确设置你的类的实例。 malloc 不调用构造函数。它不是 C++ 的一部分 在 C++ 常见问题解答中回答:isocpp.org/wiki/faq/freestore-mgmt#new-malloc-diff 不是特别的。我试图了解 malloc() 和 new 行为之间的确切区别。 malloc() 的局限性是什么?为什么 new 更好? @EdHeal:malloc 函数是 C++ 语言的一部分。除了分配对象外,调用malloc还有其他目的;比如数据缓冲区。 【参考方案1】:

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

如果方法是虚拟的,这会改变,因为 vtable 指针必须是有效的。构造函数将初始化 vtable 指针。 malloc 调用构造函数,它甚至不知道构造函数是什么——它是 C 的遗留包袱。

请注意,这不是由标准指定的,而是通常的实现方式。

【讨论】:

这是否意味着引用的非静态数据成员也被转换为静态数据成员? @سیفخان 不,每个对象都保留数据成员。只有方法 - 不需要为每个对象复制代码。 没错!如果 malloc 没有实例化一个新对象,当我尝试使用 malloc 创建多个对象或我的类的对象数组时会发生什么?如果真的没有创建新对象,我将无法分别访问每个对象的数据。但我可以! @سیفخان 创建对象有两个部分 - 为其分配内存空间,并通过构造函数对其进行初始化。 malloc 可以为对象分配存储,但不能初始化对象。了解其中的区别很重要。 我还是不清楚。为什么“初始化”会成为创建对象的一部分?假设我创建了一个具有成员 length 的类 Box。如果类中只有一个构造函数,并且我在这个构造函数中初始化length,那么当我说Box b1; b1 时仍然会“创建”一个对象具有未初始化的半径,但对象 b1已创建【参考方案2】:

您可以访问已分配但未初始化的内存,但您不能对内容做出有效的假设。成员函数独立于对象而存在,它们只是通过 this 指向未初始化的位置来调用。

【讨论】:

会员数据呢?每个对象的数据都是在创建新对象时创建的,对吗?那么,为什么在上面的代码中,我能够在尚未创建半径时访问它? (或者有吗?) @سیفخان 数据的存储已创建,因此可以访问。但是,该存储的内容可以完全未初始化,因此不知道您会得到什么。

以上是关于malloc 是不是创建类的新实例? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何检查类的给定实例是不是属于python中的主类? [复制]

EntityManager 的 find() 方法是不是会创建 JPA 类的新实例?

如何创建自定义元素扩展类的新实例

根据参数创建派生类的新实例

如何在 AppDomain 下创建类的新实例

创建类的新实例时的 Java 覆盖方法