Usuwanie dynamicznej tablicy

0

Napisałem prosty program wykorzystujący 2 funkcje do alokacji i zwalniania miejsca trzech dwuwymiarowych tablic, żeby przetestowac ich działanie zanim użyję ich w większym programie. Funkcja rezerwująca pamięc działa ok, ale nie mogę zwolnic pamięci przekazując parametry tablic do osobnej funkcji. IDE wyrzuca read access violation, a nie widzę gdzie w kodzie jest błąd.

#include "stdafx.h"

int main()
{
	int dat[4];
	int *wsk = dat;
	int **m1 = 0, **m2 = 0, **mout = 0;

	cout << "Podaj liczbe wierszy 1 tablicy" << endl;
	cin >> dat[0];
	cout << "Podaj liczbe kolumn 1 tablicy" << endl;
	cin >> dat[1];

	cout << "Podaj liczbe wierszy 2 tablicy" << endl;
	cin >> dat[2];
	cout << "Podaj liczbe kolumn 2 tablicy" << endl;
	cin >> dat[3];

	allocate(wsk, m1, m2, mout);
	cout << endl << "Dynamiczna alokacja OK" << endl;


	free(wsk, m1, m2, mout);
	cout << endl << "Dynamiczne usuwanie danych OK" << endl;

	_getch();

    return 0;
}

int allocate(int *s, int **tab1, int **tab2, int **tab3)
{
	int i, j;

	tab1 = new int *[*s];
	for (i = 0; i < *s; i++)
	{
		tab1[i] = new int[*(s + 1)];
		cout << "Wiersz "<<i+1<<" zostal zalokowany pomyslnie"<< endl;
	}

	for (i = 0; i < *s; i++)
	{
		for (j = 0; j <*(s + 1); j++)
		{
			tab1[i][j] = 1;
			cout << tab1[i][j] << " ";
		}
		cout << endl;
	}


	
	//2ga tab!
	tab2 = new int *[*(s + 2)];
	for (i = 0; i < *(s + 2); i++)
	{
		tab2[i] = new int[*(s + 3)];
		cout << "Wiersz " << i + 1 << " zostal zalokowany pomyslnie" << endl;
	}

	for (i = 0; i < *(s + 2); i++)
	{
		for (j = 0; j <*(s + 3); j++)
		{
			tab2[i][j] = 1;
			cout << tab2[i][j] << " ";
		}
		cout << endl;
	}



	//3cia tab!!! 
	tab3 = new int *[*s];
	for (i = 0; i < *s; i++)
	{
		tab3[i] = new int[*(s + 3)];
		cout << "Wiersz " << i + 1 << " zostal zalokowany pomyslnie" << endl;
	}

	for (i = 0; i < *s; i++)
	{
		for (j = 0; j <*(s + 3); j++)
		{
			tab3[i][j] = 1;
			cout << tab3[i][j] << " ";
		}
		cout << endl;
	}



	return 0;
}

int free(int *s, int **tab1, int **tab2, int **tab3)
{
	int i;

	for (i = 0; i < *s; i++)
	{
		delete[] tab1[i];
	}
	delete[] tab1;
	cout << "Tablica 1 usunieta pomyslnie" << endl;

	for (i = 0; i < *(s + 2); i++)
	{
		delete[] tab2[i];
	}
	delete[] tab2;
	cout << "Tablica 2 usunieta pomyslnie" << endl;

	for (i = 0; i < *s; i++)
	{
		delete[] tab3[i];
	}
	delete[] tab3;
	cout << "Tablica 3 usunieta pomyslnie" << endl;

	return 0;
}
2

Zamiast kombinować jak koń pod górę użyj std::vector.

A Twój problem jest taki, że oczekujesz, że x zostanie zmienione w następującym przykładzie

void zmien_x(T x)
{
	x = 0;
}

int main()
{
	T x = 42;
	zmien_x(x);
}

Gdybyś raczył odpalić to w debuggerze to problem by okazał się trywialny.

0

Za dużo gwiazdek i się gubisz. Funkcje faktycznie muszą mieć w arg 2 gwiazdki, ale w main masz mieć zwykle wskaźniki a do funkcji przekazać ich adresy przez &wsk

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