#c
#c
Вопрос:
Углубляясь в C , я работаю над мелким / глубоким копированием. Согласно MOOC, за которым я следую, следующий код должен аварийно завершиться,
// .hpp file
#ifndef _COPY_HPP_
#define __COPY_HPP_
class Shallow {
private:
int* data;
public:
void setData (int d){ *data = d;}
int getData(){ return *data;}
// constructor
Shallow (int d);
// copy constructor
Shallow(const Shallow amp;source);
//destructor
~Shallow();
};
#endif
// .cpp file
#include "copy.hpp"
#include<stdio.h>
#include<iostream>
using namespace std;
Shallow::Shallow(int d){
data = new int;
*data = d;
}
void displayShallow(Shallow s){
cout << "displayShallow: " << s.getData() << "n";
}
Shallow::Shallow(const Shallow amp;source)
: data{source.data} {
cout << "copy constructor call" << "n";
}
Shallow::~Shallow(){
delete data;
cout << "freeing data" << "n";
}
int main(){
Shallow original{100};
cout << original.getData() << "n";
// destructor called after this call
displayShallow(original);
cout << original.getData() << "n";
original.setData(29);
cout << original.getData() << "n";
return 0;
}
как (в displayShallow()
) «вызывается деструктор, и деструктор освобождает хранилище, на которое он указывает в куче. Объект, который был скопирован в эту функцию, по-прежнему указывает на это освобожденное хранилище, но он считает, что хранилище действительно, поэтому могут произойти всевозможные плохие вещи «.
Когда «учитель» запускает этот код, его программа вылетает, пока я получаю:
100
copy constructor call
displayShallow: 100
freeing data
0
29
freeing data
Кажется, что хранилище, на которое data
указывает, установлено 0
вместо сбоя. Правильно ли я это понимаю?
Комментарии:
1. «Неопределенное поведение» означает «это может привести к сбою, это может не привести к сбою, это может вызвать гнев назальных демонов »
2. Согласно MOOC — что такое «MOOC»?
3. Что ж, это еще один онлайн-курс по C , выдающий ошибочную информацию.
4. вам не гарантируется сбой, какая польза от такой гарантии?
5. Распространенным заблуждением является то, что вызов UB в C обязательно приведет к сбою. К сожалению, это не так. Это было бы неплохо, но это будет стоить, а у C есть парадигма — не платите за то, что вы не используете.