błąd przy zwolnieniu pamięci ze wskaźnika, użytego w instrukcji switch

0

Witam. Mam mały problem.
Mam taki kod:

#include<iostream>
#include<conio.h>
#include<string>
using namespace std;
int main(){
	string odpA, odpB, odpC;
	odpA="Lek przed grami losowymi";
	odpB="Lek przed ciemnoscia";
	odpC="Lek przed piatkiem trzynastego";
	
	cout<<"Co to jest nyktofobia? "<<endl;
	cout<<"A) "<<odpA<<endl;//Wyswietlamy trzy mozliwosci do wyboru
	cout<<"B) "<<odpB<<endl;
	cout<<"C) "<<odpC<<endl;
	
	char odpowiedz;
	cout<<"Twoja odpowiedz (A, B, C): ";
	cin>>odpowiedz;//Pobieramy odpowiedz od uzytkownika
	
	string *odpowiedzUzytkownika=0;//Wskaźnik, który będzie wskazywał wybraną przez użytkownika odpowiedź
	switch(odpowiedz){
		case 'A':
			odpowiedzUzytkownika=&odpA;//Ustawiamy wskaźnik na odpowiedź
			break;
		case 'B':
			odpowiedzUzytkownika=&odpB;
			break;
		case 'C':
			odpowiedzUzytkownika=&odpC;
			break;
		default:
			cout<<"Nieprawidłowy wybor"<<endl;
			break;
	}
	//teraz używamy wskaźnika do wyswietlenia wybranej przez użytkownika odpowiedzi
	cout<<"Twoja odpowiedz: "<<*odpowiedzUzytkownika<<endl;
	delete odpowiedzUzytkownika;
	odpowiedzUzytkownika=0;
	getch();
	return 0;
}

Z tego co czytałem w jednym z kursów, to jeżeli chce się zwolnić pamięć zajmowaną przez wskaźnik, to trzeba napisać
delete wskaznik;
wskaznik=0;
I tu moje pytanie.
W powyższym kodzie przecież zwalniam pamięć. Więc czemu gdy użytkownik poda odpowiedz A, B, lub C, po naciśnięciu klawisza Enter, wyskakuje mi okienko systemowe Program testowy.exe przestał działać?
W szczegółach błędu mam coś takiego:

Podpis problemu:
Nazwa zdarzenia problemu: APPCRASH
Nazwa aplikacji: testowy.exe
Wersja aplikacji: 0.0.0.0
Sygnatura czasowa aplikacji: 5280a2cb
Nazwa modułu z błędem: StackHash_0f5d
Wersja modułu z błędem: 6.1.7600.16915
Sygnatura czasowa modułu z błędem: 4ec4b137
Kod wyjątku: c0000374
Przesunięcie wyjątku: 00000000000c6ae2
Wersja systemu operacyjnego: 6.1.7600.2.0.0.256.1
Identyfikator ustawień regionalnych: 1045
Dodatkowe informacje 1: 0f5d
Dodatkowe informacje 2: 0f5db380c0da1ad59d68ac3678075ed1
Dodatkowe informacje 3: 89f2
Dodatkowe informacje 4: 89f2bcfdfb7509c610387b046e2f292f

Przeczytaj w trybie online nasze zasady zachowania poufności informacji:
http://go.microsoft.com/fwlink/?linkid=104288&clcid=0x0415

Jeśli zasady zachowania poufności informacji w trybie online nie są dostępne, przeczytaj nasze zasady zachowania poufności informacji w trybie offline:
C:\Windows\system32\pl-PL\erofflps.txt

Prosiłbym o wytłumaczenie.
Przecież jeśli nie zwolnię pamięci, to program będzie podobno zabierał coraz więcej pamięci, bo nie będzie ona zwalniana.

0

Próbujesz zwolnić obiekt na stosie. Nie zwalniaj tego wskaźnika.

Zwalniamy przez delete tylko to, co było utworzone przez new.

0

Ale w takim razie pamięć jest chyba cały czas zajęta przez ten wskaźnik. Czy jakoś inaczej jest w tym przypadku, że program sam później zwalnia pamięć.
Bo z tego co wyczytałem. jeśli nie zwolnimy pamięci zajmowanej przez wskaźnik, to program będzie zabierał coraz więcej pamięci, aż może nawet dojść do zawieszenia systemu przy większych programach.

0

poczytaj o stosie i stercie.
Tak jak @Azarien napisal. Ma byc tyle samo delete co new. Jezeli jest roznica, jest zle.
To co wyczytales dotyczy sterty. A i nie prawda jest ze jak nie zwolnisz jednego wskaznika to program przez neigo bedzie wzrastal caly czas

0

Do sterty i stosów jeszcze nie doszedłem. Więc może to przez to. I dzięki za info " A i nie prawda jest ze jak nie zwolnisz jednego wskaznika to program przez neigo bedzie wzrastal caly czas". Nie napisano o tym w kursie który czytałem. Przynajmniej zrozumiałem jakoś te wskaźniki o co w tym chodzi.

0

Ale w takim razie jak przerobić ten kod, żeby wykorzystać new

0
string* answer = new string();
/* ... */
*answer = odpA;
/* ... */
cout << *answer;
/* ... */
delete answer;

To co próbujesz zrobić nie ma żadnego sensu, no ale skoro tak chcesz...

1 użytkowników online, w tym zalogowanych: 0, gości: 1