2016-10-30 9 views
-2

В C++ создается объект без вызова такого конструктора. Учитывается ли это как определенное поведение? (Игнорируйте unfreed память кучи)Создание объекта 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', и, насколько мне известно, вам нужно создать экземпляр класса хотя бы один раз, прежде чем он будет генерировать (или, может быть, просто выводить) макет. –

Смежные вопросы