Zmienna statyczna klasy istnieje poza klasą. Tak na prawdę jest to zmienna globalna, która istnieje nawet wtedy, gdy nie ma żadnej instancji tej klasy.
Zwalnianie pamięci przydzielonej do zmiennej statycznej klasy w jej destruktorze jest złym pomysłem. Natomiast zwalnianie tej pamięci i niezerowanie wskaźnika jest BARDZO złym pomysłem.
Do zwolnienia takiej pamięci proponowałbym utworzenie osobnej statycznej funkcji, którą możesz wywołać przed wyjściem z programu.
class B
{
private:
static char* vars;
static int size_vars;
public:
static void show()
{
// zakończ funkcję jeżeli nie ustawiono zmiennej vars
if (vars == nullptr)
return;
for(int i=0; i<size_vars; i++)
cout << vars[i] << " : ";
}
void change(char* v, int n)
{
// dodaj 1 bajt dla znaku nowej linii
char* new_var = new char[size_vars + n + 1];
// zawartość starej tablicy kopiujemy tylko wtedy gdy istnieje
if (vars != nullptr) {
for(int i=0; i<size_vars; i++)
new_var[i] = vars[i];
// stara tablica nie jest już potrzebna
delete[] vars;
}
for(int i=size_vars; i<size_vars+n; i++)
new_var[i] = v[i-size_vars];
vars = new_var;
size_vars += n;
// dodajemy znak końca linii
vars[size_vars] = 0;
}
static void destroy() {
delete [] vars;
vars = nullptr;
size_vars = 0;
}
};
Ponadto zauważyłem, że podczas inicjalizacji zmiennej B::var używasz nieprawidłowego wskaźnika.
Instrukcja A(0,3).getvar() tworzy instancję klasy A i zwraca wskaźnik żyjący w tym obiekcie.
Niestety ta instancja klasy A jest niszczona w następnej linii. Wywoływane jest destruktor klasy A. Pamięć jest zwalniana. Zmienna B::var wskazuje na zwolnioną pamięć.
Aby rozwiązać ten problem przypisz do zmiennej B::var nullptr lub zaalokuj nowy napis (w obu przypadkach ustaw prawidłową wartość zmiennej B::size_vars)
char* B::vars = new char[4]{'X','Y','Z', 0};
int B::size_vars = 3;
// lub
// char* B::vars = nullptr;
// int B::size_vars = 0;