PDA

Visualizza la versione completa : [C++] crash programma matrici durante la fase di caricamento


Lodin
27-03-2015, 13:24
Ciao a tutti,
ho notato che stranamente il codice del programma che sto facendo crasha se inserisco come numero di colonne e righe un valore diverso.
La matrice è allocata dinamicamente quindi questo problema non dovrebbe proprio porsi...
ecco il codice:


#include <iostream>


using namespace std;


int main()
{
int i=0, j=0, m=0, n=0;
int **matrice;




cout<<"Inserire il numero di righe della matrice: ";
cin>>m;
cout<<"Inserire il numero di colonne della matrice: ";
cin>>n;


matrice = new int*[m];
for(i=0;i<n; i++)
matrice[i] = new int[n];


cout<<"OK"<<endl;


for(i=0;i<m;i++)
{
for(j=0; j<n; j++)
{
cout<<"Inserire elemento ["<<i<<";"<<j<<"]: ";
cin<<matrice[i][j];
//CRASHA QUI DOPO QUALCHE CICLO
}
}


cout<<"OK"<<endl;


for(i=0;i<m;i++)
{
cout<<endl;
for(int j=0;j<n;j++)
{
cout<<matrice[i][j]<<" - ";
}
}


cout<<"OK"<<endl;


for(i=0;i<m;i++)
delete matrice[i];
delete matrice;


cout<<"OK"<<endl;


return 0;
}

LeleFT
27-03-2015, 13:42
Beh...



matrice = new int*[m];
for(i=0;i<n; i++)
...



Istanzi un array di M puntatori e lo scorri da 0 a N...


Ciao. :ciauz:

oregon
27-03-2015, 13:47
Cosa noti di diverso tra la for della allocazione e la for della deallocazione ?

Lodin
27-03-2015, 14:07
sono un....una persona diversamente intelligente xD ahahhaha

grazie per avermi fatto notare l'errore...
ero convinto che l'errore stesse da un altra parte e non ho controllato bene in quel punto del codice

Ora funziona, grazie mille!

Lodin
27-03-2015, 23:20
raga avrei un altra domanda:
avendo questa funzione che si occupa di deallocare una matrice mxn:

void dealloca_matrice(int **matrice, int m, int n)
{
for(int i=0;i<m;i++)
delete[] matrice[i];
delete[] matrice; //cosa cambia se scrivo delete[] *matrice; ? durante l'esecuzione non noto differenze
}


come mai se dealloco una matrice mxn con m>n l'ultima riga della matrice non viene deallocata?
es:
passo una matrice 3x2:
1 2
3 4
5 6
dopo la deallocazione, se stampo la matrice mi esce:
139320 134688
134688 139320
5 6

come mai?
da notare inoltre che l'elemento 0,0 ha lo stesso valore dell'elemento 1,1 e l'elemento 0,1 ha lo stesso valore dell'elemento 1,0 e questo succede sempre...non è stranissimo?

oregon
27-03-2015, 23:33
Deallocare non significa modificare/azzerare il contenuto della matrice.

Dopo la deallocazione il contenuto precedente può essere lo stesso o cambiare in maniera non prevedibile.

Lodin
27-03-2015, 23:39
però non mi spiego una cosa: dopo la deallocazione di una determinata variabile questa non può essere piu utilizzata giusto? allora perchè se stampo la matrice, questa i viene stampata senza alcun problema (anche se con numeri strani) ?

oregon
27-03-2015, 23:49
Non può essere utilizzata nel senso che non puoi "essere sicuro" di poterla leggere/scrivere in quanto la memoria è riutilizzabile per altri scopi in qualsiasi momento. Ma finché questo non avviene, potresti ancora poterla leggere senza problemi.

Lodin
28-03-2015, 12:16
mmmh....devo studiarmi meglio la deallocazione. Pensavo che una volta che una variabile viene deallocata, questa non può più essere utilizzata ne per assegnazioni, ne per stampe ecc...

oregon
28-03-2015, 13:50
Il C non vieta l'uso di variabili deallocate, ma sia la lettura sia la scrittura sono a rischio e pericolo dell'utilizzatore. Non si può prevedere ma la memoria potrebbe essere non più disponibile (hai un crash), potrebbe essere modificata (non hai più i valori che avevi memorizzato) o può essere ancora disponibile. Quello che devi comprendere è che dopo la deallocazione non hai più garanzie.

Loading