Вы интерпретируете часть необработанной памяти (то, что возвращает std::malloc()
) как объект (приведение (node*)malloc(...)
) и затем получаете доступ к члену на нем (s2->a
).На практике вам это может сойти с рук, если тип содержит только элементы встроенных типов и не имеет указателей, но технически это вызывает неопределенное поведение.
Вызывать неопределенное поведение плохо, потому что это позволяет вашей программе делать что угодно.Это может привести к сбою вашей программы, молчаливому получению неверных результатов, форматированию жесткого диска, сгоранию вашего процессора, забеременеть, или это может работать так, как вы ожидали.Теперь он может вести себя по-разному, но по-разному с новой версией компилятора, обновлением ОС, на другой платформе, на сайте клиента, когда ваш начальник смотрит, по воскресеньям или в зависимости от фазы луны.
Конструктор - это то, что превращает необработанную память в действительный объект.Конструкторы запускаются автоматически, когда вы создаете объекты в стеке, глобальные объекты или используете выражение new
.Вы можете разделить выделение памяти и конструкцию, используя размещение новых .Сделав это, вы можете взять память, выделенную std::malloc()
, и вызвать для нее конструктор.Но почему вы хотите это сделать?За исключением оптимизации (и как механизма, используемого типами в C ++ std lib), размещение новых редко когда-либо требуется.
Почему ваш вопрос был помечен C++
в любом случае?Конечно, компилятор C ++ скомпилирует его с несколькими очевидными исправлениями, но кроме C ++ - стиля, включающего заголовки C std lib, в нем нет ничего C ++, и он полон C-isms.
Вы уверены, что выхотите программировать на C ++?Или тебе не удобнее с С?Если это так, то лучше придерживаться C, чем писать C на C ++.Многое из того, что считается хорошим в C, считается плохим в C ++.