[C/C++] Program z tablicą dynamiczną

Witam. Napisałem taki programik, który wypisuje w wierszach kolejne liczby (ilość liczb zależy od 2^nr wiersza). Ilość wierszy jest podawana przez użytkownika.

#include "stdafx.h"

#include 

#include 

#include 

using namespace std;


int _tmain(int argc, _TCHAR* argv[])

{

	int n,i,j;

	int **w;


	cout << "N: "; cin >> n;

	if(n>=0 && n <=20)

	{

		w = (int**) malloc(n*sizeof(int));


		for(i=0; i
		{

			int p = pow(2.0,i);

			w[i] = (int*) malloc(p*sizeof(int));

			for (j=0; j < p; j++)

				w[i][j] = j+1;

		}

	}

	cout << endl;


	for(i=0; i
	{

		for(j=0; j < pow(2.0,i); j++)

			cout << w[i][j] << " ";

		cout << endl;

	}


	free(w);

	cout << endl;

	system("pause");

	return 0;

}

Jednak chciałbym się dowiedzieć jak by można użyć tutaj new() i delete() zamiast malloc i free.

malloc(n*sizeof(typ)) - new typ(bez jednej gwiazdki)[n];

free(ptr*) - delete[] ptr;

free(ptr**) - delete ptr;

* - wskaźnik na tablicę(new[])

** - wskaźnik na pojedynczy obiekt.

Zrobiłem coś takiego ale pokazuje się błąd

#include "stdafx.h"

#include 

#include 

#include 

using namespace std;


int _tmain(int argc, _TCHAR* argv[])

{

   int n,i,j;

   int **w;


   cout << "N: "; cin >> n;

   if(n>=0 && n <=20)

   {

      w = new int*[n];

	  //w = (int**) malloc(n*sizeof(int));



      for(i=0; i
      {

         int p = pow(2.0,i);

         w[i] = new int[p];

		 //w[i] = (int*) malloc(p*sizeof(int));

         for (j=0; j < p; j++)

            w[i][j] = j+1;

      }

   }

   cout << endl;


   for(i=0; i
   {

      for(j=0; j < pow(2.0,i); j++)

         cout << w[i][j] << " ";

      cout << endl;

   }

   delete[]w;

   delete w;

   //free(w);

   cout << endl;

   system("pause");

   return 0;

}

Może mi ktoś wyjaśnić jaki błąd robię.

Następnym razem podaj jaki to błąd :wink:

Masz tutaj memory leak(wyciek pamięci) gdyż źle zwalniasz w. Musisz zwalniać w identyczny(prawie) sposób co alokujesz, tylko, że od końca. Czyli gdy robisz:

int **ptr;

ptr = new int*[5]; //Alokujemy tablicę wskaźników na int(pierwszy wymiar)

for(int i = 0; i < 5; ++i)

   ptr[i] = new int[5];//Alokujemy drugi wymiar

Musisz zwolnić tak:

for(int i = 0; i < 5; ++i)

   delete[] ptr[i]; //Zwalniamy każdą sub-tablicę(drugi wymiar).

delete[] ptr;//Zwalniamy tablicę wskaźników(pierwszy wymiar).

Ciągle mam błąd :? http://wstaw.org/images/free/2009/04/07/2c86da0bb10be08255f2b3892a1918.jpeg

Dodane 07.04.2009 (Wt) 20:24

Własnie doszedłem że program się sypie tylko dla n={0,1,2,3,4}. Ktoś wie w czym problem?

#include using namespace std;

Dzięki [alex]