|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Member
Iscritto dal: Jan 2008
Messaggi: 103
|
[c++] puntatori
Codice:
struct _ARGB2
{
byte R;
byte G;
byte B;
byte A;
};
typedef _ARGB2* ArgbPtr;
Codice:
_ARGB2 (*_in)[640] = new _ARGB2[480][640]; Codice:
ArgbPtr *_inPtr = new ArgbPtr[480];
if (_inPtr != null)
{
for (int i = 0; i < 480; i++)
_inPtr[i] = new _ARGB2[640];
|
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Oct 2006
Città: Roma
Messaggi: 1383
|
questo:
é sbagliato: il fatto che tu specifichi una costante numerica nella dichiarazione fa si' che l'array di primo livello venga allocato staticamente, quindi in quel caso devi solo allocare gli array di secondo livello.
l'altro invece é corretto ma il controllo dell'if é inutile perché l'operatore new non restituisce mai NULL (in caso di risorse di sistema insufficienti lancia un'eccezione C++ di tipo std::bad_alloc). per quanto riguarda la deallocazione, il secondo va deallocato all'inverso del primo, cioé iterando sull'array di primo livello e facendo delete su ciascun array di secondo livello ed infine facendo delete sull'array di primo livello. il primo invece non lo so ![]() forse devi fare: Codice:
delete[][] _in; |
|
|
|
|
|
#3 |
|
Member
Iscritto dal: Jan 2008
Messaggi: 103
|
Ciao, grazie per la risposta
per il primo ho provato con delete [] [] _in; ma da errore, possibile che sia solo delete [] _in; ? perchè il [640] viene cancellato automaticamente ? |
|
|
|
|
|
#4 | |
|
Senior Member
Iscritto dal: Oct 2006
Città: Roma
Messaggi: 1383
|
Quote:
la sintassi che hai usato tu, delete[] _in, si usa per deallocare gli array a una sola dimensione; forse si usa anche per quelli a piu dimensioni. questa cosa interessa anche a me quindi se ho tempo provo a cercare qualcosa, altrimenti attendo con te un parere piu esperto. |
|
|
|
|
|
|
#5 | |||
|
Senior Member
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
|
Quote:
con un array che contiene 480 di tali elementi. Quote:
La differenza fondamentale sta nella rappresentazione in memoria. Nel primo caso gli array stanno "tutti in fila" nell'array che li contiene, nel secondo caso hai invece dei soli puntatori. Codice:
_in :
[[ .... ] [ ... ] [ ... ]]
_inPtr
[[ - ][ - ][ - ]]
| | |
[...] [...] [...]
Codice:
cout << "sizeof(_in)=" << sizeof(_in) << endl;
cout << "sizeof(_in[0])=" << sizeof(_in[0]) << endl;
cout << "sizeof(_inPtr)=" << sizeof(_inPtr) << endl;
cout << "sizeof(_inPtr[0])=" << sizeof(_inPtr[0]) << endl;
Codice:
sizeof(_in)=4 sizeof(_in[0])=2560 sizeof(_inPtr)=4 sizeof(_inPtr[0])=4 Quote:
Codice:
delete [] _in;
for ( int i=0 ; < 480; ++i )
delete [] _inPtr[i];
delete[] _inPTr;
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele |
|||
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Oct 2006
Città: Roma
Messaggi: 1383
|
marco.r, si usa "delete[]" (con una sola coppia di parentesi quadre) anche quando con new si é allocato un array a due o piu dimensioni?
|
|
|
|
|
|
#7 | |
|
Senior Member
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
|
Quote:
La peculiarita' del primo e' che gli elementi sono un qualcosa di piu' corposo di un semplice int o float. Visto che gli array contenuti si trovano "in linea" il compilatore non ha bisogno di far altro che usare la sua dimensione (che e' decisa staticamente e quindi conosce, in questo caso 2560, 640*4) per poter deallocare correttamente l'array puntato da _in;
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele |
|
|
|
|
|
|
#9 | |
|
Senior Member
Iscritto dal: Apr 2010
Città: Frosinone
Messaggi: 416
|
Quote:
|
|
|
|
|
|
|
#10 | |
|
Senior Member
Iscritto dal: Oct 2006
Città: Roma
Messaggi: 1383
|
Quote:
le due delete in sostanza hanno una semantica diversa: delete senza parentesi quadre assume che tu gli abbia passato un blocco contenente un solo oggetto del tipo puntato, delete[] invece fa un calcolo di quanti oggetti di quel tipo sono contenuti nel blocco di memoria da liberare. la spiegazione fa schifo ma spero che si comprenda. |
|
|
|
|
|
|
#11 |
|
Senior Member
Iscritto dal: Oct 2006
Città: Roma
Messaggi: 1383
|
ecco, prova per esempio questo codice:
Codice:
#include <iostream>
using namespace std;
class C {
public:
~C() {
cout << "farewell" << endl;
}
};
int main() {
delete new C[3];
return 0;
}
Codice:
#include <iostream>
using namespace std;
class C {
public:
~C() {
cout << "farewell" << endl;
}
};
int main() {
delete[] new C[3];
return 0;
}
|
|
|
|
|
|
#12 | |
|
Senior Member
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
|
Quote:
Faccio un esempio Codice:
#include <iostream>
using namespace std;
struct Foo{ ~Foo(){ cout << "bye bye" << endl;} };
int main()
{
Foo* f1 = new Foo[10];
Foo* f2 = new Foo[10];
cout << "delete f1" << endl;
delete f1;
cout << "delete[] f2" << endl;
delete[] f2;
}
Codice:
delete f1 bye bye delete[] f2 bye bye bye bye bye bye bye bye bye bye bye bye bye bye bye bye bye bye bye bye
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele |
|
|
|
|
|
|
#13 | |
|
Senior Member
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
|
Quote:
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele |
|
|
|
|
|
|
#14 |
|
Member
Iscritto dal: Jan 2008
Messaggi: 103
|
tnx
edit: ah, secondo voi in un cellulare è meglio usare il primo o il secondo ( o non cambia nente da uno all'altro sui cell nuovi con trecentomillemiggglioni gb di ram ) ? Ultima modifica di Q_Q : 16-08-2010 alle 16:26. |
|
|
|
|
|
#15 | |
|
Senior Member
Iscritto dal: Oct 2006
Città: Roma
Messaggi: 1383
|
Quote:
molto difficilmente avrai problemi di performance a causa di simili scelte, se ne dovessi mai avere é solo allora che dovrai refattorizzare, ammesso che la causa sia quella. |
|
|
|
|
|
|
#16 | |
|
Senior Member
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
|
Quote:
In generale se uno vuole evitare inefficiente, in C++ evita di allocare un doppio array in questo modo, piuttosto si crea una classe apposita che utilizzi un unico array. Qualcosa tipo Codice:
template <typename T>
class Matrix
{
typedef T& reference;
typedef const T& const_reference;
Matrix(size_t rows,size_t cols ):_nRows(rows),_nCols(cols)
{
_data = new value_type[rows*cols];
}
reference operator()(size_t row,size_t col)
{
assert( row <_nRows );
assert( col < _nCols );
return _data[ _nRows*col + row ];
}
const_reference operator()(size_t row, size_t col) const;
// etc
private:
size_t _nRows;
size_t _nCols;
};
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele |
|
|
|
|
|
|
#17 | |
|
Senior Member
Iscritto dal: Oct 2006
Città: Roma
Messaggi: 1383
|
Quote:
Codice:
_ARGB2 _in[640][480]; |
|
|
|
|
|
|
#18 | |
|
Member
Iscritto dal: Jan 2008
Messaggi: 103
|
Quote:
|
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 17:05.





















