Мелкая копия не сбой

#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 есть парадигма — не платите за то, что вы не используете.