Newsgroup: it.comp.lang.c++
Titolo: problemi con la HEAP

ciao, ho un problema con la heap che non riesco a risolvere e mi perseguita
da alcuni giorni.
Mi scuso per la terminologia forse non corretta e ringrazio anticipatamente
per eventuali suggerimenti.
Dichiaro un puntatore ad una mia classe CPezzo (che poi č come una struct):
CPezzo *A_Pezzi;
Poi creo un array di oggetti nella heap in questo modo:
A_Pezzi = new CPezzo[n_pez];
Poi alla fine libero la heap in questo modo:
delete [] A_Pezzi;
Cosa diavolo c'č che non va? (e a volte manda in crash il mio programma e il
sistema).
Grazie.
DANILO

 un'eccezione se hai sballato.
Uhm, non confondiamo le idee al poveo Danilo.
O lo instanzi così:
  std::vector<CPezzo> A_Pezzi( n_pez ); 
e quindi usi "A_Pezzi[indice]", "A_Pezzi.at(indice)", e non fai nessun
'delete'; oppure lo instanzi così:
  std::vector<CPezzo> * A_Pezzi = new std::vector<CPezzo>(n_pez);
e usi "(*A_Pezzi)[indice]", "A_Pezzi->at(indice)" e fai 'delete' alla
fine.
Max

 sistema).
mi sembra che non ci sia niente che non va qui, forse dovresti
controllare meglio il distruttore di CPezzo, se sei proprio sicuro che
il crash avvenga qui.

 sistema).
Sicuro di non sforare l'indice [n_pez -1] ?
comunque il consiglio e' di usare i vector invece che gli array:
#include <vector>
std::vector<CPezzo> A_Pezzi = new std::vector<CPezzo>(n_pez);
per accedere usi A_Pezzi[indice] come per i normali array
oppure A_Pezzi.at(indice) che verifica prima le dimensioni lanciando
un'eccezione se hai sballato.
e poi alla fine fai
delete A_Pezzi;
--
Gerolamo
Using: Win2000 Pro, Borland C++ Compiler 5.5.1
Listening: Sting - Roxanne

 il crash avvenga qui.
Grazie.
Cosa intendi per controllare il distruttore di CPezzo?
....Non ho nessun distruttore di CPezzo!!
Non ho poi detto (perchč credo che sia corretto) che utilizzo l'array in
questo modo:
A_Pezzi[i] = A_pezzi[k];
Ma anche se faccio:
A_Pezzi[i].dato1 = A_pezzi[k].dato1;
A_Pezzi[i].dato2 = A_pezzi[k].dato2;
A_Pezzi[i].dato3 = A_pezzi[k].dato3;
ecc.
non cambia niente (ogni tanto crash!).

 ha scritto nel messaggio
news:Pine.LNX.4.10.101112...@c64.comm2000.it...

Grazie.
Ora provo, ma non vorrei che la vostra soluzione appesantisse il tutto
visto che ho assolutamente bisogno della massima velocità
(sono all'interno di un'algoritmo molto complesso).

 delete A_Pezzi;
(in questo caso, non avendo usato la new, la delete non serve )
in generale, quando si possono evitare le allocazioni esplicite con new,
e' consigliabile farlo (come in questo caso).
Nota che gli elementi contenuti nel vector stanno comunque nello heap,
ma e' il vector che si occupa di gestirne correttamente allocazioni e 
deallocazioni. 
Saluti,
Fabio
-- 
Posted from 
flopiano.mm.eutelsat.org
 [194.214.173.28] 
via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 non cambia niente (ogni tanto crash!).
Questo può dipendere dal precedente.
Forse dovresti postare almeno la dichiarazione della classe.
Ciao,
Cecco


Allora, cosa fa questo?
delete [] A_Pezzi;
Secondo me dovrebbe bastare quest'istruzione qui sopra.
Comunque vi posto qualcosa di piů preciso:
class CPezzo
{
public:
    int id;
    int disp;
    int usati;
    int dx;
    int dy;
    int nr;
public:
    CPezzo& operator=(const CPezzo &p);
};
CPezzo& CPezzo::operator=(const CPezzo &p)
{
    if (this == &p) return *this;
    id      = 
p.id
;
    disp    = p.disp;
    usati   = p.usati;
    dx      = p.dx;
    dy      = p.dy;
    nr      = 
p.nr
;
     return *this;
}
////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////
class CCorexDlg : public CDialog
{
// Construction
public:
 CCorexDlg(CWnd* pParent = NULL);   // standard constructor
    ~CCorexDlg();
// Attributes
public:
    CPezzo *A_Pezzi;
// Dialog Data
 //{{AFX_DATA(CCorexDlg)
 enum { IDD = IDD_COREX };
 CButton m_StartControl;
 //}}AFX_DATA
// Overrides
 // ClassWizard generated virtual function overrides
 //{{AFX_VIRTUAL(CCorexDlg)
 protected:
 virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
 //}}AFX_VIRTUAL
// Implementation
public:
 BOOL OnInitDialog();
// Generated message map functions
 //{{AFX_MSG(CCorexDlg)
 afx_msg void OnStart();
 //}}AFX_MSG
 DECLARE_MESSAGE_MAP()
};
//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately
before the previous line.
////////////////////////////////////////////////////////////////////////////
/
// CCorexDlg dialog
CCorexDlg::CCorexDlg(CWnd* pParent /*=NULL*/)
 : CDialog(CCorexDlg::IDD, pParent)
{
 //{{AFX_DATA_INIT(CCorexDlg)
 //}}AFX_DATA_INIT
}
CCorexDlg::~CCorexDlg()
{
    delete [] A_Pezzi;
}
void CCorexDlg::DoDataExchange(CDataExchange* pDX)
{
 CDialog::DoDataExchange(pDX);
 //{{AFX_DATA_MAP(CCorexDlg)
 DDX_Control(pDX, IDC_START, m_StartControl);
 //}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CCorexDlg, CDialog)
 //{{AFX_MSG_MAP(CCorexDlg)
 ON_BN_CLICKED(IDC_START, OnStart)
 //}}AFX_MSG_MAP
END_MESSAGE_MAP()
////////////////////////////////////////////////////////////////////////////
/
// CCorexDlg message handlers
////////////////////////////////////////////////////////////////////////////
/
// Inizializzazione della finestra COREX
BOOL CCorexDlg::OnInitDialog()
{
    CDialog::OnInitDialog();
    //n_pez me lo calcolo in qualche modo.
    A_Pezzi = new CPezzo[n_pez];
    return TRUE;
}
////////////////////////////////////////////////////////////////////////////
/
// OnStart
void CCorexDlg::OnStart()
{
    //mio algoritmo
}

 }
Suppongo che tu abbia problemi in questa funzione. Se hai fatto le
correzioni suddette e ancora hai problemi i casi sono due: o OnStart
viene chiamata prima di OnInitDialog(), cosa che puoi verificare
testando se A_Pezzi vale zero, oppure il problema è altrove e devi
postare il codice di CCorexDlg::OnStart() se ti serve aiuto.
--
Andrea Ferro
---------
Brainbench C++ Master. Scored higher than 97% of previous takers
Scores: Overall 4.46, Conceptual 5.0, Problem-Solving 5.0
More info 
http://www.brainbench.com/transcript.jsp?pid=2522556

 Hai definito corretamente il copy constructor e ridefinito l'operatore
"=".
Tanto per precisare, doveva essere una domanda.
Ciao,
Cecco

 Uhm, non confondiamo le idee al poveo Danilo.
ooops.. intendevo
std::vector<CPezzo> * A_Pezzi = new std::vector<CPezzo>(n_pez);
ma ho dimenticato il *
mea culpa...
(ora che rileggo avevo sbagliato anche un . al posto di un ->
che disastro... :-)
gli ho proposto la versione col new semplicemente per mantenermi
aderente a quello che aveva postato lui e non dovergli far fare anche
altre modifiche al codice
Per rispondere qui anche a Fabio Lopiano: si, ho un passato da
javaiolo e questo a volte mi frega...
ufff....
--
Gerolamo
Using: Win2000 Pro, Borland C++ Compiler 5.5.1
Listening: Sting - All this time

 deallocazioni.
Che gli elementi stiano comunque nello heap e' definito dallo standard
o e' solo l'implementazione piu' tipica in sistemi PC-like?
--
Gerolamo

 o e' solo l'implementazione piu' tipica in sistemi PC-like?
Dove stanno gli elementi lo controlli tu con l'allocator. Se usi
l'allocator di default, stanno nello heap.


 ha scritto nel messaggio
news:x%VK7.4485$BA4.1...@news1.tin.it...

Grazie, grazie, grazie!!
Dopo tre giorni di impazzimento ho trovato una "cazzatina" nel mio algoritmo
che mi faceva (a volte) sforare i limiti dell'array nella heap.
E a ripensarci non poteva che essere cosě!
Comunque grazie ancora.
Ciao!!
DANILO.