Вызвано исключение прав доступа 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_;
}
};