Memory Management

Was gibt folgendes Programm aus?

#include<iostream>
#include<vector>
 
int main() {
  int a = 5;
  int* b = &a;
  int* c = &b;
  
  std::cout << c;
 
  return 0;
}

Optionen: Wert von a, Wert von b, undefiniertes Verhalten, kompiliert nicht.
Korrekt: kompiliert nicht.

Was gibt das folgende Programm aus?

#include<iostream>
 
int main(){
  int a = 5;
  int* b = &a;
  
  delete b;
  
  std::cout << a;
  
  return 0;
}

Optionen: Wert von a, Wert von b, undefiniertes Verhalten, kompiliert nicht.
Korrekt: undefiniertes Verhalten

Was gibt das folgende Programm aus?

#include<iostream>
 
void foo(int* f, int* g){
  *g = *f;
  delete f;
}
 
int main(){
  auto a = new int(5);
  auto b = new int(2);
  
  foo(a,b);
  
  std::cout << *a;
  
  return 0;
}

Optionen: 2, 5, undefiniertes Verhalten, kompiliert nicht.
Korrekt: undefiniertes Verhalten

Was gibt das folgende Programm aus?

#include<iostream>
 
void foo(int* a, int* b){
  b = a;
  delete a;
}
 
int main(){
  auto a = new int(5);
  auto b = new int(2);
  
  foo(a,b);
  
  std::cout << *b;
  
  return 0;
}

Optionen: 2, 5, undefiniertes Verhalten, kompiliert nicht.
Korrekt: 2

Kann ich im allgemeinen bestimmen, was der Wert von *g ist, nachdem ich foo(f,g) für zwei beliebige int* f,g aufgerufen habe, falls ich die Werte *f und *g vor dem Aufruf kenne?

void foo(int* a, int* b){
  *b = *a;
  delete a;
}

Optionen: Ja, Nein
Korrekt: Nein