Zero-Giulio
12-02-2012, 14:01
A proposito degli array classici del C, quelli per intenderci:
int v [10];
Come faccio a gestire un eventuale errore di memoria non dispobile?
Immaginate per esempio una cosa di questo tipo:
(lo scrivo direttamente sul forum perchè non ho tempo di compilare, se ci sono errori di sintassi lasciate perdere)
template <int N, typename T>
class gvec {
public:
private:
T ptr [N];
}
In questo caso l'oggetto gvec può venire creato in qualunque punto nel mio programma.
Come faccio a essere sicuro che abbia memoria a sufficienza?
E in caso negativo, come catturo l'errore?
Secondo quesito.
Immaginate che io abbia una seconda classe:
(di nuovo, la scrivo al volo di fretta, lasciate perdere eventuali errori)
template <typename T>
class list {
public:
void push (const T & t);
private:
gvec <10, T> v;
gvec <10, T> * next;
}
La classe lista, come immaginate, dovrebbe essere una lista di vettori.
Il puntatore next è inizialmente settato a NULL, ma può puntare a un altro vettore quando il precedente è pieno.
La creazione del nuovo gvec e l'assegnazione di next hanno luogo nel metodo push.
Senza accortezza questa roba non credo possa funzionare: il gvec creato nel metodo push viene poi automaticamente distrutto quando esco dalla stessa funzione, quindi il puntatore next finisce che punta a niente di buono.
La domanda è: come risolvere questo problema?
L'unica idea che mi è venuta in mente è aggiungere un attributo booleano nella classe gvec, attributo che viene letto nel metodo distruttore dei gvec. Questo attributo (di default false) se true evita di liberare la memoria (operazione che eventualmente posso fare nel distruttore della classe list).
Avete altre idee?
int v [10];
Come faccio a gestire un eventuale errore di memoria non dispobile?
Immaginate per esempio una cosa di questo tipo:
(lo scrivo direttamente sul forum perchè non ho tempo di compilare, se ci sono errori di sintassi lasciate perdere)
template <int N, typename T>
class gvec {
public:
private:
T ptr [N];
}
In questo caso l'oggetto gvec può venire creato in qualunque punto nel mio programma.
Come faccio a essere sicuro che abbia memoria a sufficienza?
E in caso negativo, come catturo l'errore?
Secondo quesito.
Immaginate che io abbia una seconda classe:
(di nuovo, la scrivo al volo di fretta, lasciate perdere eventuali errori)
template <typename T>
class list {
public:
void push (const T & t);
private:
gvec <10, T> v;
gvec <10, T> * next;
}
La classe lista, come immaginate, dovrebbe essere una lista di vettori.
Il puntatore next è inizialmente settato a NULL, ma può puntare a un altro vettore quando il precedente è pieno.
La creazione del nuovo gvec e l'assegnazione di next hanno luogo nel metodo push.
Senza accortezza questa roba non credo possa funzionare: il gvec creato nel metodo push viene poi automaticamente distrutto quando esco dalla stessa funzione, quindi il puntatore next finisce che punta a niente di buono.
La domanda è: come risolvere questo problema?
L'unica idea che mi è venuta in mente è aggiungere un attributo booleano nella classe gvec, attributo che viene letto nel metodo distruttore dei gvec. Questo attributo (di default false) se true evita di liberare la memoria (operazione che eventualmente posso fare nel distruttore della classe list).
Avete altre idee?