2016-10-30 86 views
-2

在C++中,创建一个对象而不调用像这样的构造函数。这是否按照定义的行为计算? (忽略不确定的堆内存)没有构造函数调用的C++对象创建

class Foo { 
public: 
    int *ptr; 
    int a, b; 

    Foo() { ptr = new int{}; } 
    ~Foo() { delete ptr; } 
    void set(int a_, int b_) {a = a_; b = b_;} 
    void print() { std::cout << *ptr << a << b; } 
}; 

int main() { 
    char *array[sizeof(Foo)]; // note the pointer 
    *((int**)array) = new int{3}; 
    ((Foo*)array)->set(1, 2); 
    ((Foo*)array)->print(); // 312 
} 
+8

不,这是完全和完全未定义的行为,由于太多不同的原因列出。 –

+2

您并未创建对象,只是将现有的内存位置投射到对象。 – Robert

+0

标准C++语法有什么问题? –

回答

2

您正在构建一个内存块,可以保存该对象的数据,但这不是一个对象。

一个对象可能远远超过那片内存,更多的是由编译器决定的。它可能没有更多,但它可能是很多其他的事情。

+0

作为附录:如果你打算这样做,你会想找到你的编译器选项来显示类的布局,你的代码很可能是平台相关的。 MSVC使用'/ d1reportSingleClassLayoutX',其中'X'是类的名称(或其名称的一部分)。 Clang使用'-Xclang -fdump-record-layouts',据我所知,在生成布局之前(或者只是输出),你至少需要实例化类。 –

相关问题