Вызвано исключение прав доступа MS Visual Studio

class Person {

public:
    char* name;

    Person(const char* name1) {
        strcpy(name, name1);
        cout << name << endl;
    }
};

Вот вызывающий код:

Person* name = new Person("Check");

Есть такой код. Понимаю что лучше не использовать char* а использовать string, и не использовать strcpy, но такое условие задания. Почему в том же CLion компилируется, а тут выводит:

Вызвано исключение по адресу 0x00007FFE2EA3D1CD (ucrtbased.dll) в Lab1.exe: 0xC0000005: нарушение прав доступа при записи по адресу 0x0000000000000000.

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

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

Поскольку вероятно в классе Person будет несколько текстовых полей, чтобы не повторять код можете написать свою мини-версию класса string, где инкапсулировать владение памятью под строку.
Вряд ли вам нужно будет много операций с такими строками - создание, присвоение, сравнение. Ну и нужно будет соблюсти правило трёх
Конкретно по операции из вопроса алгоритм действий такой:

  • узнать длину входной строки (через strlen)
  • выделить память под строку
  • скопировать данные из входящей строки в свой буфер
  • в деструкторе класса освободить память. (или вместо простого указателя использовать std::unique_ptr<>) Как-то так:
class Person {
private:
   char* name_ = nullptr;
public:
   Person(const char* name1) 
   {    
        if(!name1)  // проверка на нулевой указатель
           return;
        size_t length = strlen(name1);
        if(!length)  // проверка на нулевую длину строки
           return;
        name_ = new char[length+1];
        strcpy(name_, name1);
        cout << name_ << endl;
   }
   ~Person()
   {
      delete[] name_;
   }
};
→ Ссылка