Operator new, c++, zawieszanie konsoli


(romic) #1

Witam,

obecnie jestem na etapie nauki języka C++ i doszedłem do momentu, w którym używany jest operator new. Problem występuje wtedy gdy próbuję usunąć wskaźnik pokazujący na tablice utworzona za pomocą tego operatora. Gdy program się wykona konsola się zawiesza, pisze, że program przestał działać i w miejscu gdzie powinien zwrócić 0 zwraca 255. Nie wiem w czym jest rzecz. Bardzo proszę o poradę.

Przykładowy program:

/*

Napisz program odwrocona, który po wprowadzeniu wielkości tablicy oraz wartości poszczególnych 

elementów przez użytkownika skopiuje tablice nr 1

do tablicy nr 2 w odwróconej kolejności po czym wyświetli zawartość tablicy numer 2

*/


#include 

#include 

using namespace std;


int main()

{	

	int rozmiar; //rozmiar tablicy i poda go uzytkownik	


	cout<<"Ile liczb chcesz podac?: ";

	cin>>rozmiar;

	int *wsk1=new int[rozmiar]; //towrzymy tablice za pomoca operatora new,

	int *wsk2=new int[rozmiar]; //towrzymy tablice w ktora skopiujemy odwrotnie tekst


	for(int i=0, a=1;i
	{	

		cout<<"Podaj "<
		cin>>*wsk1;

	}


	system("cls"); //czyscimy ekran


	wsk1-=rozmiar; //cofamy wskaznik by pokazywal na pierwszy element tablicy


	cout<<"Tablica 1:"<
	for(int i=0, a=1;i
	{

		cout<<"Element nr. "<
	}


	cout<

	wsk1-=1; //cofamy wskaznik o 1 bo wlaczony jest na element o 1 po tablicy bo gdy wychodzil z petli to go zdazyla przesunac


	cout<<"Tablica 2:"<
	for(int i=0, a=1; i
	{

		*wsk2=*wsk1;

		cout<<"Element nr. "<
	}


	delete [] wsk1; //konczymy program i sprzatamy po sobie

	delete [] wsk2;


	cout<
	system("pause");

}




[/code]

(kostek135) #2

Wskaźnik musi wskazywać na pierwszy element podczas usuwania tablicy. Najlepiej po prostu stworzyć dodatkowy wskaźnik (taki pseudo iterator) i nim "bawić się" a na koniec usunąć przy użyciu pierwszego wskaźnika.


(Rolek0) #3

Uczysz się dopiero alokować pamięć a już bawisz się arytmetyką wskaźników? Ciekawe :wink:

Jakbyś dodał sobie wypisanie wartości tych wskaźników to byś zauważył, że po wszystkim nie wskazują już na początki zaalokowanych bloków i próba usunięcia wskazywanej przez nie pamięci powoduje błąd.

Przed usuwaniem popraw adresy, albo zrób sobie dodatkowe zmienne, w których będziesz trzymał oryginalne adresy.

PS

:wink:


(romic) #4

Wielkie dzięki. Teraz działa. Nie było o tym nigdzie wspomniane ale to też logiczne.