Привет, я новичок здесь, так извините, если я сделал какие-либо формальные ошибки.Ошибка отладки - выражение: _CrtlsValidHeapPointer (block)
У меня проблема с моей библиотечной программой, которая имеет два класса: Book and Person. Ошибка появилась после того, как я написал _customer = customer; в Книжном конструировании.
Как мне интерпретировать ошибку? Что я делаю не так?
Person класс
class Person{
private:
char* _name;
int _id;
static int personCounter;
public:
void setName(char* name);
void setId(int id);
char* getName();
char* getName() const;
int getId();
int getId()const;
void showData();
Person();
Person(int id, char* name);
Person(const Person &tempPerson);
~Person();
};
Person конструктор копирования
Person::Person(const Person &tempPerson) {
_id = tempPerson.getId();
_name = new char[strlen(tempPerson.getName())];
strcpy(_name, tempPerson.getName());
personCounter--;
}
класс Книга
class Book{
private:
char* _title;
char* _author;
char* _genre;
bool _borrowed;
Person _customer;
static int counter;
public:
void setTitle(char* title);
void setAuthor(char* author);
void setGenre(char* genre);
void setStatus(bool borrowed);
void setPerson(Person customer);
char* getTitle();
char* getAuthor();
char* getGenre();
bool getStatus();
Person getPerson();
void showData();
Book();
Book(char* title, char* author, char* genre, bool borrowed, const Person &customer);
~Book();
};
книги Конструктор
Book::Book(char* title, char* author, char* genre, bool borrowed,const Person &customer){
counter++;
_title = new char[strlen(title) + 1];
strcpy(_title,title);
_author = new char[strlen(author) + 1];
strcpy(_author, author);
_genre = new char[strlen(genre) + 1];
strcpy(_genre, genre);
_borrowed = borrowed;
_customer = customer;
}
Это не время компиляции, а ошибка времени выполнения. Утверждения используются для указания некоторых из необходимых условий для вызова этой функции. Используйте ваш отладчик, чтобы проверить, какие параметры вы фактически использовали для его вызова. –
Вы забыли +1 на strlen в конструкторе Person Person. Вот почему люди используют строковые классы в C++, а не в указателях raw char. – antlersoft
Также я настоятельно рекомендую не управлять динамическим распределением памяти самостоятельно. Вместо этого используйте стандартные классы контейнеров или [умные указатели] (http://en.cppreference.com/w/cpp/memory). –