@MaratPetrov96

Почему delete вызывает ошибку?

На дистанционке не приняли код на C++.

Почти переделал, но есть непонятный момент

Среда - Microsoft Visual C++ 6.0

class Car{
	private:
		char* marka; //марка авто
		int power; //мощность двигателя в кВт
		float cost; //стоимость в тыс. $
		int displacement; //объём двигателя
	public:
		void setData(char* m, int pw, float p, int dis) {
		  marka = m;
		  power = pw;
		  cost = p;
		  displacement = dis;
		}
		std::string getData() {
			string to_return = "Marka is ";
			to_return += marka;
		    return to_return;
		}
	public:
		Car(char* m = "Renault", int pw = def_power, float p = def_price, int dis = def_displacement){ //создание объекта по умолчанию
			marka = m;
			power = pw;
			cost = p;
			displacement = dis;
		};
	public:
		void Print(){ //вывод параметров на экран
			cout << getData() << endl;
			cout << "Price equals " << cost << " thousand $" << endl;
			cout << "Power equals " << power << " kW" << endl;
			cout << "Displacement equals " << displacement << " cm3" << endl;
		};
		void Input(); //функция ввода параметров, ещё не определена
		};
 
void Car::Input(){ //функция ввода параметров
        char *marka_ = new char; //создаём динамический объект marka
        std::cout << "Input mark: "; //введите марку авто
        std::cin >> marka_;
        std::cout << std::endl;
 
		do{
        std::cout << "Input power (kW): "; //введите мощность авто в кВт
        std::cin >> power;
		} while(power < 0);
        std::cout << std::endl;
 
		do{
        std::cout << "Input cost (thousand $): "; //введите стоимости авто в тыс. $
        std::cin >> cost;
		} while(cost < 0);
        std::cout << std::endl;

		do{
		std::cout << "Input displacement (cm3): "; //введите объём двигателя в см3
        std::cin >> displacement;
		} while(displacement < 0);
        std::cout << std::endl;
 
        Car ipnut; //создание нового объекта
		ipnut.setData(marka_,power,cost,displacement);
		ipnut.Print(); //вывод параметров объекта на экран
		delete marka_;
    };


Строчка delete marka_ вызывает ошибку

DAMAGE: after Normal block (#80) at 0x008C1990

Всё это при том, что в основном cpp файле удаление динамических объектов работает.

Кроме того, хотелось бы на всякий случай сделать проверку, введено ли число.

А ещё написали "Разделяйте код заголовочных файлов .h, реализацию методов сделайте в соответствующих cpp-файлах".

UPD: главную проблему решил, изменив просто char на char[16]
  • Вопрос задан
  • 184 просмотра
Пригласить эксперта
Ответы на вопрос 2
Adamos
@Adamos
Главная ошибка - в нашей системе образования,где одни мудаки накропали методичек с использованием массивов и сишных строк в С++, а другие учат по ним третьих, и конца этому не видно.
Хотя в этом коде достаточно было бы использовать string везде вместо char* - и при этом всем было бы легче: и ТС, и проверяющему, и компилятору... и никаких утечек с UB.
Ответ написан
Комментировать
wataru
@wataru Куратор тега C++
Разработчик на С++, экс-олимпиадник.
Первая ошибка:
char *marka_ = new char;

Тут вы выделяете память под ровно один символ. Строку туда читать не получится никак (не забывайте, что вам еще байт для нулевого символа в конце строки нужен).

Вторая ошибка:
char* m = "Renault"

Тут используется значение аргумента по умолчанию, где у вас строковая константа. Тут не происходит копирование строки, просто в переменную m сохраняется адрес вот этой вот константы, которую компилятор куда-то в памяти проложения засунет. Вы не выделяли эту память, поэтому попытка сделать delete на ней - неопределенное поведение, что в данном удачном случае приводет к крэшу.

У вас вообще проблема тут - marka может указывать на выделенную вами в Input() память, а может указывать на переданную из вне память. Кто ее удалять должен-то? Так же в Input() вы можете переписать переданный в конструкторе указатель. А надо ли было его удалять классу?

Я бы сделал в конструкторе всегда копирование переданной строки. Тогда можно будет передавать туда и строковые константы и использовать вот такое вот значение по умолчанию.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы