2016-10-30 2 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

합니다 (unfreed 힙 메모리를 무시),하지만 그 대상이 아닙니다.

개체는 해당 메모리 조각보다 더 많은 잠재적으로 구성되며, 정확히 무엇이 컴파일러에 달려 있습니다. 일 수는 있지만 그 밖의 많은 것들이있을 수 있습니다.

+0

부록으로 :이 작업을 수행하려면 컴파일러의 클래스 레이아웃 표시 옵션을 찾고 코드가 플랫폼에 따라 달라질 수 있습니다. MSVC는'/ d1reportSingleClassLayoutX'를 사용합니다. 여기서'X'는 클래스 이름 (또는 이름의 일부)입니다. Clang은'-Xclang -fdump-record-layouts'을 사용하고, 레이아웃을 생성 (또는 출력 만하기)하기 전에 클래스를 적어도 한 번 인스턴스화해야한다는 것을 알고 있습니다. –