Как правильно инициализировать указатель?

Имеется класс, в котором значения по умолчанию присваиваются сразу при создании объекта класса:

#include <iostream>
using namespace std;

enum state { empty, deleted, used };//Константы для заполнения состояния ячейки
class guest
{
public:
    char pasport[12];
    string name;
    int birthyear;
    string adris;
    string purpose_of_travel;
    guest* head;//Указатель на голову списка
    guest* next;//Указатель на следующий элемент списка при возникновении коллизии
    int st;//Состояние ячейки
    guest(const char *pasport_m = "8015-175572", const string name_m = "No Name",
        const int birthyear_m = 0, const string address_m = "No Adress",
        const string purpose_of_travel_m = "No Info" , const int st_m=0,   guest *next_m=NULL, guest* head=NULL);
};

В части кода, где я создаю новый указатель типа *guest и выделаю под него память происходит ошибка присваивания значений. Вот эта часть кода:

guest *temp = (guest*)malloc(sizeof(guest));
                tesst->next = temp;
                temp->name = cur_guest->name;
                temp->adris = cur_guest->adris;
                temp->birthyear = cur_guest->birthyear;
                temp->next = NULL;

что не так делаю? При сборке ошибку не выдает. Ошибка вылезает непосредственно при отладке. Пишет вот так: введите сюда описание изображения


Ответы (1 шт):

Автор решения: Harry

При выделении через malloc вы просто получаете неинициализированную память. Конструктор не вызывается, все ваши string на самом деле никакие не строки, а просто кусок памяти того же размера с мусором.

В С++ используйте new, только new! Никаких malloc - по крайней мере пока не научитесь точно понимать, что и как работает (это для тех, кто сейчас начнет рассказывать о placement new).

Вся инициализация полей должна идти через конструктор, который автоматически вызывается при использовании new. И вообще, делая поля открытыми, вы фактически отвергаете одного из китов ООП - инкапсуляцию.

→ Ссылка