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中的主类? [复制]