System.AccessViolationException at cout << line
Итак, я получил это Exception
и я знаю, что это только потому, что я новичок в C++, а мой код неверен (так что нет, это уже не заданный вопрос).
я получил Frog.cpp
файл и program.cpp
файл.
Frog.cpp:
#include <iostream>
#include <conio.h>
#include "Frog.h"
using namespace std;
Frog::Frog()
{
(*this).status = Free;
(*this).color = "Green";
(*this).weight = 200; // In grams
}
Frog::Frog(float weight, int age, char* color, char* nickname, Status status)
{
(*this).weight = weight;
(*this).age = age;
(*this).color = color;
(*this).nickname = nickname;
(*this).status = status;
}
Frog::Frog(float weight, int age)
{
(*this).weight = weight;
(*this).age = age;
}
void Frog::currentState()
{
cout << "Weight:" << (*this).weight << " ,Age:" << (*this).age << " ,Color:" << (*this).color << " , Nickname:" << (*this).nickname << " , Status:" << (*this).status << endl; // The ling that causeing the mayhem
}
Frog.h:
#ifndef FROG_H
#define FROG_H
typedef enum Status { Free, Urban, Plate, Dead };
class Frog
{
private:
float weight;
int age;
char* color;
char* nickname;
Status status;
public:
Frog();
Frog(float weight, int age, char* color, char* nickname, Status status);
Frog(float weight, int age);
void currentState();
};
#endif
Program.cpp:
#include <iostream>
#include <conio.h>
#include "Frog.h"
using namespace std;
void main()
{
Frog frog = Frog();
frog.currentState(); // I get the Exception on this line
getch();
}
Исключение:
Unhandled Exception: System.AccessViolationException: Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
at std.char_traits<char>.length(SByte* _First) in c:\program files (x86)\microsoft visual studio 12.0\vc\include\iosfwd:line 523
at std.operator<<<struct std::char_traits<char> >(basic_ostream<char\,std::char_traits<char> >* _Ostr, SByte* _Val) in c:\program files (x86)\microsoft visual studio 12.0\vc\include\ostream:line 791
at Frog.currentState(Frog* )
Плохая линия cout << "Weight:" << (*this).weight << " ,Age:" << (*this).age << " ,Color:" << (*this).color << " , Nickname:" << (*this).nickname << " , Status:" << (*this).status << endl;
в Frog.cpp
,
Любые предложения будут очень признательны.
2 ответа
Frog frog = Frog();
создает построенный по умолчанию Frog
, Ваш конструктор по умолчанию
Frog::Frog()
{
(*this).status = Free;
(*this).color = "Green";
(*this).weight = 200; // In grams
}
Который не инициализируется nickname
, Когда вы идете, чтобы распечатать его в currentState()
Вы получаете доступ к указателям мусора. Это неопределенное поведение и вызывает нарушение прав доступа.
Я предлагаю вам использовать std::string
так что вам не нужно беспокоиться об этом. Я также предлагаю вам использовать список инициализации члена. С этим ваш класс будет выглядеть
class Frog
{
private:
float weight;
int age;
std::string color;
std::string nickname;
Status status;
public:
Frog() : status(Free), color("Green"), weight(200), age(0), nickname("") {}
Frog(float weight, int age, std::string color, std::string nickname, Status status) :
status(status), color(color), weight(weight), age(age), nickname(nickname) {}
Frog(float weight, int age);
void currentState();
};
Хорошо, я просто тупой.
как @jaggedSpire предложил:
Я не инициализировал nickname
и age
свойства.
Хотя я думаю, что в C++
свойства получают значение по умолчанию, если я использую конструктор по умолчанию.
Спасибо, парни.