对不存在的对象调用成员函数工作正常,c++

Calling member function on non existing object works correctly, c++

本文关键字:工作 c++ 函数 成员 不存在 对象 调用      更新时间:2023-10-16

考虑以下代码:

#include <iostream>
using namespace std;
class someClass
{
public:
    someClass(){ cout<<"someClass"<<endl; }
    void g() const { cout<<"g()"<<endl;}
};
int main()
{
    void* memory = new void*[5*(sizeof(someClass)/sizeof(char))];
    someClass *someClassArray = reinterpret_cast<someClass*>(memory);
    for(int i=0;i<5;i++)
    {
        someClassArray[i].g();
    }       
}

此代码的输出为:

g()
g()
g()
g()
g()

这意味着没有调用构造函数。但在数组中,someClassArray是someClass类型的对象,我可以调用g()函数并获得正确的输出。

为什么这个程序是正确执行的,而没有构造someClass类型的对象?

当调用成员函数g()时,编译器只需将指向对象的指针作为第一个参数传递给它(即指向已分配的类型为void*的数组的元素,您将其解释为someClass*)。函数不使用此指针来访问类的任何数据成员。事实上,对于这个简单的类,构造函数不需要构造任何东西。该类没有数据成员。因此,调用函数是没有问题的。

someClass是一个没有状态的类。g()不是像vtable指针那样处理的,而是一个正则函数,这并不奇怪。

你在这里做的是迎合直觉的未定义行为,重新解释_测试,而不是规范。

已经为someClass对象分配了内存,您调用了new。但是,由于调用是new void而不是new someClass,所以它还没有调用someClass构造函数。

g()的调用之所以有效,是因为已经分配了this指针。只有构造函数操作永远不会执行。