Newsgroup: it.comp.lang.c++
Titolo: new Vs. malloc

Ciao a tutti,
ho un questito da porvi. Le funzion 'C' che permettono di gestire
dinamicamente la memoria danno la possibilità di riallocare un puntatore, mi
spiego meglio... se ho allocato un puntatore a 20 elementi e ad un certo
momento vorrei allocarne 10 nuovi senza cancellare i precedenti 20 allocati
basta che usi la funzione 'realloc'; in C++ utilizzando cioè l' operatore
'new' è possibile fare la stessa cosa?? o devo passare per forza attraverso
una copia temporanea del vettore ??
Grazie anticipatamente!


no
puoi usare array delle stl od altro per fare qualcosa che si ridimensiona...
ciao

 attraverso una copia temporanea del vettore ??
Considera l'uso del new con placement. Per maggiori informazioni, leggi 
questo articolo:
"Constructing an Object at a Pre-Determined Memory Position" By Danny Kalev 
(
http://gethelp.devx.com/techtips/cpp_pro/10min/10min0999.asp
)
Ciao!
-- 
---
*************** | Have you ever retired a human by mystake?
*** Azathot *** |
*************** | To contact me, ask me gently. Thanks.


Puoi usare più semplicemente un container standard, come std::vector
-- 
Gerolamo

questo articolo:...
Se intendi dire che potrebbe allocare la memoria con malloc,
costruirci dentro gli oggetti e poi provare a fare realloc
allora sappi che questo non si puo' fare in generale.
Il motivo e' che realloc potrebbe non avere spazio
sufficiente per "estendere" l'area e quindi potrebbe
dover allocare un'area piu' grande e copiare il
contenuto corrente. Questo e' anzi il proprio il
caso tipico... l'eccezione e' quando realloc riesce
a evitare di spostare l'area. Il problema e' che per
copiare il contenuto pero' realloc usa una copia
bit-a-bit invece di costruttori di copia e questo
non e' permesso per classi generiche, ma solo per
tipi POD.
HTH
Andrea

 tipi POD.
Sì, questo l'avevo pensato. D'altronde, pensavo che parlando di "malloc()" 
non si parlasse di cose diverse da classi POD.


 non si parlasse di cose diverse da classi POD.
Allora non capisco piu'....
Prima parli di uso alternativo di new e dici che non volevi fare realloc
perhe' sai che da problemi in C++!
(pero' non spiegi cosa intendi per alternativo (se non placement new)).
Ora invece sembra che tu ti riferisca invece ai tipi POD e quindi suggerissi
di implementare quello che descrive Andrea.
In questo caso tanto vale usare direttamente realloc() senza fare questo
processo inutile a due stadi!
Insomma in entrambi i casi non si capisce cosa tu volessi fare con il
placement new.
Il placement new lo conosciamo tutti....
Potresti invece illuminarci su come lo avresti usato per creare una cosa
equivalente a realloc in C++ ?!?
Tommy

 Se non e' quello che ha discusso Andrea Griffini, quale allora?
Tommy, con un tono del genere ritengo del tutto superfluo risponderti. Il 
mio tempo lo ritengo molto prezioso, e perderlo con te mi sembra un peccato 
mortale.


 mortale.
Ma cosa stai dicendo?
Se non sai cosa rispondere alla domanda:
"Potresti invece illuminarci su come avresti usato il placement new per
creare una cosa equivalente a realloc in C++ ?"
non trovare scuse cosi' patetiche per favore. Taci o rispondi dicendo di non
saper cosa dire. Ma non essere cosi' infantile per favore.
Se invece sai come rispondere, hai una brillante idea etc.... o qualche cosa
di simile.....
allora rispondi alla domanda. forse siamo tutti (non solo io visto che non
ti sto simpatico, ma tutti) interessati alla tua risposta.
Se invece di fare un peccato mortale e perdere qualche secondo a rispondermi
con questo tuo msg avessi risposto a tono, parlando dell'argomento, avresti
forse fatto una figura migliore ed avresto forse aiutato Emanuale (che
buttando li una cosa che a prima vista ha poco a che fare con quello che
chiede non hai aiutato molto ;-)
A presto,
Tommy

 non saper cosa dire. Ma non essere cosi' infantile per favore.
<plonk>


 creare una cosa equivalente a realloc in C++ ?"
Suppongo che Azathot abbia ragionato come segue:
 - Emanuele è convinto (erroneamente) che realloc rappresenti una qualche
forma di ottimizzazione rispetto ad allocare nuova memoria con malloc, copiare
e liberare quella vecchia
 - per ottimizzare il meccanismo di riallocazione della memoria
nell'implementazione di un vettore di oggetti è indispensabile ricorrere al
placement new
 - quindi, forse il placement new è ciò di cui Emanuele ha bisogno
Max

  - quindi, forse il placement new è ciò di cui Emanuele ha bisogno
Credo che per una cosa semplice gli stiate consigliando un percorso piu'
complicato del necessario, con il placement new.
Nella maggior parte dei casi usare un contenitore come std::vector (senza
perdersi nei dettagli di cui parli) risolve il problema.
Tommy

 Suppongo che Azathot abbia ragionato come segue:
Supponi giusto. :)
Saluti!


Max
Dalla descrizione secondo me Emanuele ha bisogno di std::vector.
Andrea

 Dalla descrizione secondo me Emanuele ha bisogno di std::vector.
Concordo.
Tommy

 Supponi giusto. :)
Appena hai trovato una via d'uscita dal buco dove ti eri cacciato....  ;-)
Quello che penso io e' che hai letto il thread (poco sopra) "Ragazzi sono in
crisi: classe vector." di Gabriele e hai suggerito quello di cui si parlava
in quel thread senza pero' capirci un tubo: il placement new.
Per provare a capire hai fatto una ricerca in rete ed hai trovato il link
http://gethelp.devx.com/techtips/cpp_pro/10min/10min0999.asp
 che non e'
certamente la bibbia del placement new pero' ;-) Hai capito l'abc e poi hai
rifilato il tutto per fare bella figura.
Poi ti sei trovato in crisi perche' non avevi abbastanza competenza in
materia. Appena Max M. (che e' molto piu' competente) ti ha dato la
possibilita' di una via di uscita l'hai presa al volo; facendo ancora una
votla capire quanto tu sia infantile e codardo (da non ammettere una tua
ignoranza in materia). La verita' e' che se tu mi avessi saputo rispondere
lo avresti fatto! Cosi' e' il tuo carattere, non sai tacere. Quindi non hai
risposto solo perche' non sapevi cosa dire.
Questo e' quello che penso io. So di aver fatto un dispiacere a tutto il NG
a rispondere a questo tuo messaggio. Solo non sopporto i comportamenti cosi'
infantili ed arroganti....
Max M. supponeva che tu avessi ragionato nel modo da lui riportato... Beh,
quello qua riportato e' quello che IO suppongo sia successo. Sono pareri
personali. La verita' la sai solo TU, ma non la dirai mai.....
Tommy

 Appena hai trovato una via d'uscita dal buco dove ti eri cacciato....  ;-)
DON'T FEED THE TROLL!!!
Z.
P.S. azimut grazie per il link! Anche io forse avrei approvato l'uso di
vector, ma credo che la tua soluzione fosse più "inerente" alla domanda in
questione.

 DON'T FEED THE TROLL!!!
Ok, ok... anche se, a dire il vero, non lo vedo più (grande invenzione i 
kill files dei news reader!). In ogni caso, è chiaro che Tommy soffre di un 
classico caso di scarsa attività sessuale... e deve trovare un modo per 
sfogarsi...
Capiamolo...
Ciao!
-- 
P.S. Anche se non mi sta simpatico, spero sul serio che non diventi cieco a 
forza di... 8-D 8-D 8-D


 ha scritto nel messaggio
news:l0oxa.9148$lK4.2...@twister1.libero.it...

In C non c'era STL invece ora puoi usare le classi contenitore come vector,
list e altre e non preoccuparti più della loro allocazione in memoria, sono
provviste inoltre di comodi iteratori per scorrerle in lungo e in largo,
hanno ovviamente funzioni membro molto potenti che invece prima ti dovevi
costruire.
La scelta è raccomandabile nella maggior parte delle applicazioni.
Ecco un piccolo esempio (banale e veloce) dove puoi vedere come nella
maggior parte dei casi con STL non devi allocare proprio niente, perché c'è
chi lavora per te.
Viene chiesto d'inserire 10 stringhe, poi altre 5 (ma non ci preoccupiamo
della sua dimensione né della sua ridimensione). Al posto si string puoi
usare qualsiasi tipo, struttura o classe.
#include <iostream>
#include <vector>
#include <string>
using namespace std;
void inserisci(vector<string>& v,string messaggio,int i) {
        string a;
        cout << messaggio << endl;
        for (unsigned int j=0;j<i;j++) {
                cout << "stringa " << v.size()+1 << " ? ";
                cin >> a;
                v.push_back(a);
        }
}
int main(int argc, char* argv[])
{
        vector<string> v;
        string a;
        inserisci(v,"Inserisci n. 10 stringhe",10);
        inserisci(v,"Ora altre 5",5);
        cout << "Il vettore ha " << v.size() << " elementi.\n";
        for (vector<string>::iterator i=v.begin();i!=v.end();i++)
                cout << *i << endl;
        return 0;
}
ciao.
ps chiedo scusa a tutti per la banalità dell'esempio...