array bidimensionale

L'una vale l'altra presa così in modo isolato. Per di più se apri il file WString c'è questa nota prima dei metodi +=, nota che riporto sotto:

// if there's not enough memory for the concatenated value, the string
// will be left unchanged (but this isn't signalled in any way)

Quindi direi che non si crea frammentazione.

Però il puntatore all'oggetto String (instanza di classe omonima) è nello stack quando la creazione dell'oggetto è in ambito locale. Terminato l'ambito il puntatore non esiste più, prima che ciò accada in C++ viene chiamato il metodo distruttore presente in WString.cpp qui riportato:

String::~String()
{
	free(buffer);
}

Che libera la memoria allocata nello heap.

Il problema si presenta dopo continue chiamate a malloc e conseguente free, ma posso anche scrivere codice con l'obbiettivo di evitare che il problema si presenti.

Per semplifiare 30 "x" sono le locazione di memoria di cui dispongo

xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Prima allocazione
AAAAxxxxxxxxxxxxxxxxxxxxxxxxxx
free()
Sempre 30 celle libere ho.
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Vediamo più allocazioni

Prima allocazione 10 celle
AAAAAAAAAAxxxxxxxxxxxxxxxxxxxx
Seconda allocazione 5 celle
AAAAAAAAAAAAAAAxxxxxxxxxxxxxxx
free() sulla prima allocazione
xxxxxxxxxxAAAAAxxxxxxxxxxxxxxx
Terza allocazione di 16 celle
malloc fallisce anche se ci sono in totale 10 celle + 15 = 25
ma non ne trova 16 contigue.

Questo per semplificare poiche malloc ha un algoritmo che cerca di evitare sprechi, purtroppo
non essendoci altri attori la responsabilità del fallimento ricade su malloc, mentre su un PC ciò
non accade poiché malloc lavora in uno spazio di memoria concesso al processo che il kernel crea,
in sostanza il kernel crea il processo e gli da anche un porzione di memoria per lavorare.
Se il processo esegue codice che fa riferimento in scrittura verso un indirizzo di memoria che non gli è stata concessa, il kernel dice "io ti ho fatto e io ti distruggo" e sul terminale leggerai "segmantaion fault".

Allora il kernel pare proprio un dio?
Secondo me è un liberale con supremi poteri del tipo: la vedi sta mano po esse fero e po esse piuma. :smiley:
Ciao.