Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Ryzen Threadripper 9980X e 9970X alla prova: AMD Zen 5 al massimo livello
Ryzen Threadripper 9980X e 9970X alla prova: AMD Zen 5 al massimo livello
AMD ha aggiornato l'offerta di CPU HEDT con i Ryzen Threadripper 9000 basati su architettura Zen 5. In questo articolo vediamo come si comportano i modelli con 64 e 32 core 9980X e 9970X. Venduti allo stesso prezzo dei predecessori e compatibili con il medesimo socket, le nuove proposte si candidano a essere ottimi compagni per chi è in cerca di potenza dei calcolo e tante linee PCI Express per workstation grafiche e destinate all'AI.
Acer TravelMate P4 14: tanta sostanza per l'utente aziendale
Acer TravelMate P4 14: tanta sostanza per l'utente aziendale
Forte di soluzioni tecniche specifiche, il notebook Acer TravelMate P4 14 abbina dimensioni compatte e buona robustezza per rispondere alle necessità specifiche degli utenti aziendali. La piattaforma AMD Ryzen 7 Pro assicura prestazioni elevate con i tipici ambiti di produttività personale e sul lavoro, mantenendo un'elevata autonomia.
Hisense M2 Pro: dove lo metti, sta. Mini proiettore laser 4K per il cinema ovunque
Hisense M2 Pro: dove lo metti, sta. Mini proiettore laser 4K per il cinema ovunque
Dal salotto al giardino, il nuovo proiettore laser di Hisense promette esperienze cinematografiche in qualsiasi contesto: qualità d’immagine, semplicità d’uso, versatilità e prezzo competitivo il suo poker d'assi
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 03-04-2011, 23:39   #1
Barbalbero
Registered User
 
Iscritto dal: Aug 2006
Messaggi: 305
[C++] double free alla prima free()

Ho una struttura
Codice:
struct Struttura{
        tipo **matrice;
};
più avanti nel codice utilizzo la struttura:

Codice:
Struttura * var = (Struttura *) malloc(sizeof(Struttura));
    Struttura->matrice = (tipo **) malloc(dimensione * sizeof (tipo *));
    for (int i = 0; i < altra_dimensione; i++) {
        Struttura->matrice[i] = (tipo *) malloc(altra_dimensione * sizeof (tipo));
    }
;

più avanti ancora decido di deallocare tutto:

Codice:
for(int i=0;i<dimensione;i++){
     free(Struttura->matrice[i]);
}
...
Alla prima occasione in cui chiamo la free() ottengo un errore:
double free or corruption (out): 0x08ccb060

Ho guardato ovunque, non ho trovato una soluzione che funzioni.
C'è qualche errore in ciò che faccio?
Se non chiamo la free il programma funziona correttamente, e anzi vi dirò di più... se al posto del ciclo per deallocare la matrice ci metto un doppio ciclo per stampare i valori della matrice, me li stampa senza problemi. Questo significa che la memoria non è stata già deallocata e non è nemmeno corrotta.

(Nota: Se non dealloco la matrice ma dealloco la Struttura, funziona, ma suppongo che resti della memoria spazzatura, per questo insisto per deallocare la matrice. Ho notato che se ciclo l'esecuzione del programma infinite volte, la memoria allocata continua a crescere, quindi suppongo che sia a causa di questa mancata deallocazione)

(per semplificare il codice non l'ho scritto, ma in realtà la struct Struttura è puntata da un puntatore all'interno di un'altra struttura, ma non credo che la cosa sia rilevante)

Ultima modifica di Barbalbero : 03-04-2011 alle 23:42.
Barbalbero è offline   Rispondi citando il messaggio o parte di esso
Old 04-04-2011, 07:42   #2
tomminno
Senior Member
 
Iscritto dal: Oct 2005
Messaggi: 3306
Se stai effettivamente usando C++ non usare assolutamente malloc e free.

Per quanto riguarda il tuo errore mi sembra che il problema possa essere l'indice su cui iteri:
malloc: for (int i = 0; i < altra_dimensione; i++)
free: for(int i=0;i<dimensione;i++)

Oppure potrebbe essere qualcos'altro che non hai postato.
tomminno è offline   Rispondi citando il messaggio o parte di esso
Old 04-04-2011, 08:41   #3
Barbalbero
Registered User
 
Iscritto dal: Aug 2006
Messaggi: 305
il bound del ciclo forse l'ho copiato sbagliato, ma se il problema fosse quello il problema salterebbe fuori solo ad una certa iterazione, non alla prima, come accade adesso.
Le altre cose che faccio nel programma non credo siano rilevanti, poiche si tratta solo di operazioni sui dati, nessun'altra free. Ora non posso, ma più tardi proverò a deallocare immediatamente dopo l'allocazione, per esserne sicuro.
Perchè non devo usare malloc? advanced linux programming consiglia di usare malloc
Barbalbero è offline   Rispondi citando il messaggio o parte di esso
Old 04-04-2011, 10:21   #4
Hunho
Member
 
Iscritto dal: Apr 2008
Messaggi: 55
Quote:
Originariamente inviato da Barbalbero Guarda i messaggi
il bound del ciclo forse l'ho copiato sbagliato, ma se il problema fosse quello il problema salterebbe fuori solo ad una certa iterazione, non alla prima, come accade adesso.
Le altre cose che faccio nel programma non credo siano rilevanti, poiche si tratta solo di operazioni sui dati, nessun'altra free. Ora non posso, ma più tardi proverò a deallocare immediatamente dopo l'allocazione, per esserne sicuro.
Perchè non devo usare malloc? advanced linux programming consiglia di usare malloc
scrivi in C++, usa le caratteristiche del C++; new e delete in vece rispettivamente di malloc (o calloc) e free, e non mischiare assolutamente le cose.
Hunho è offline   Rispondi citando il messaggio o parte di esso
Old 04-04-2011, 10:40   #5
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
@Barbalbero: potresti usare Valgrind per scoprire il problema.
__________________

As long as you are basically literate in programming, you should be able to express any logical relationship you understand.
If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it.
(Chris Crawford)
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 04-04-2011, 10:55   #6
Barbalbero
Registered User
 
Iscritto dal: Aug 2006
Messaggi: 305
ok ho provato un nuovo codice:
Codice:
    struttura->tab->nrows = dim;
    struttura->tab->ncols = 2 * dim + 3;
    struttura->tab->matrix = (mpf_t **) malloc(struttura->tab->nrows * sizeof (mpf_t *));

    for (int i = 0; i < struttura->tab->ncols; i++) {
        struttura->tab->matrix[i] = (mpf_t *) malloc(struttura->tab->ncols * sizeof (mpf_t));
    }

    for (int i = 0; i < struttura->tab->ncols; i++) {
            free(struttura->tab->matrix[i]);
     }
tab è una struct all'interno della struct struttura
In tab c'è un array bidimensionale matrix con le relative dimensioni.
in pratica ho provato a deallocare subito dopo aver allocato lo spazio, per vedere se era colpa di qualche operazione intermedia.
Il problema persiste.

Quote:
scrivi in C++, usa le caratteristiche del C++; new e delete in vece rispettivamente di malloc (o calloc) e free, e non mischiare assolutamente le cose.
ok ma perché? in università mi hanno sempre sconsigliato di usare la new e advanced linux programming preferisce usare la malloc. Se c'è un buon motivo per cui non dovrei utilizzare la malloc in c++ la smetto immediatamente.

Quote:
@Barbalbero: potresti usare Valgrind per scoprire il problema.
Anche ieri ho trovato su un forum che consigliavano di utilizzare valgrind, ma essendo un debugger non credo che potrà aiutarmi. Però ora lo installo e se non è troppo complicato vedo se può essermi d'aiuto.

Secondo me il problema comunque è molto banale, guardate il codice nuovo. Sono 4 righe di codice, evidentemente faccio qualcosa di non permesso, non lo so, per esempio mettere un array in una struttura dentro un'altra struttura, non ne ho idea
Barbalbero è offline   Rispondi citando il messaggio o parte di esso
Old 04-04-2011, 11:09   #7
Barbalbero
Registered User
 
Iscritto dal: Aug 2006
Messaggi: 305
ok forse ho un'illuminazione. Forse il problema sta nella libreria GMP. Probabilmente devo fare qualcosa prima di deallocare questo tipo di dato.
Ora cerco sulla guida poi vi faccio sapere
Barbalbero è offline   Rispondi citando il messaggio o parte di esso
Old 04-04-2011, 11:28   #8
marco.r
Senior Member
 
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
Dove deallochi struttura->matrice ?
__________________
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
marco.r è offline   Rispondi citando il messaggio o parte di esso
Old 04-04-2011, 11:30   #9
Barbalbero
Registered User
 
Iscritto dal: Aug 2006
Messaggi: 305
Quote:
Originariamente inviato da marco.r Guarda i messaggi
Dove deallochi struttura->matrice ?
la deallocherei dopo avere deallocato i vari elementi, ovvero dopo il codice che genera l'errore
Barbalbero è offline   Rispondi citando il messaggio o parte di esso
Old 04-04-2011, 12:03   #10
Barbalbero
Registered User
 
Iscritto dal: Aug 2006
Messaggi: 305
Quote:
— Function: void mpf_clear (mpf_t x)
Free the space occupied by x. Make sure to call this function for all mpf_t variables when you are done with them.
Probabilmente lo spazio deve essere deallocato con questa funzione e non è necessaria nessuna ulteriore free. Probabilmente.
Barbalbero è offline   Rispondi citando il messaggio o parte di esso
Old 04-04-2011, 13:38   #11
tomminno
Senior Member
 
Iscritto dal: Oct 2005
Messaggi: 3306
Quote:
Originariamente inviato da Barbalbero Guarda i messaggi
ok ma perché? in università mi hanno sempre sconsigliato di usare la new e advanced linux programming preferisce usare la malloc. Se c'è un buon motivo per cui non dovrei utilizzare la malloc in c++ la smetto immediatamente.
Se all'università ti hanno sconsigliato di usare new sono dei cialtroni. In C++ new è l'operatore per allocare dinamicamente la memoria.
malloc è la funzione di allocazione del C.
Il primo problema che si presenta utilizzando malloc invece di new è che non viene richiamato il costruttore della classe, pertanto cadono un bel po' di postulati del C++.
Per quanto riguarda advanced linux programming molto probabilmente parla delle librerie di sistema che sono in C.


Anche ieri ho trovato su un forum che consigliavano di utilizzare valgrind, ma essendo un debugger non credo che potrà aiutarmi. Però ora lo installo e se non è troppo complicato vedo se può essermi d'aiuto.

Secondo me il problema comunque è molto banale, guardate il codice nuovo. Sono 4 righe di codice, evidentemente faccio qualcosa di non permesso, non lo so, per esempio mettere un array in una struttura dentro un'altra struttura, non ne ho idea[/quote]
tomminno è offline   Rispondi citando il messaggio o parte di esso
Old 04-04-2011, 17:00   #12
Tommo
Senior Member
 
L'Avatar di Tommo
 
Iscritto dal: Feb 2006
Messaggi: 1304
Sfortunatamente C++ duplica gran parte delle strutture di C, ma spesso lo fa saltando dei pezzi

Ci sono molti casi in cui quello che si vuole fare è proprio allocare della memoria non inizializzata per un'uso futuro, e in quel caso new oltre a essere lento è anche abbastanza pericoloso; ad esempio se fai new float*[n] ti dovrai ricordare di non chiamare delete, ma delete[].
Che per quanto mi riguarda è una schifezza, ed è anche inutilmente non trasparente rispetto a malloc/free, che se si sa cosa si sta facendo sono molto più chiari e sicuri (allochi n byte, se non riesce da NULL. Punto.).

Per non parlare di tutti quei casi in cui si manovrano i singoli byte, e allora malloc è perfetto.

E tra l'altro nemmeno new[] e delete[] chiamano i costruttori/distruttori

E vogliamo parlare dell'overload di new, o del fatto che new non ha un comportamento definito in caso di errore?

Io più imparo C++ più mi rendo conto di usare un "C con le classi", tanta, troppa roba "avanzata" in C++ è semplicemente stata realizzata male e complica soltanto la vita, partendo dalla STL per finire ai templates.

Quindi pls prima di dire boiate come "lol c'hai C++ usa new" pensateci
__________________
*ToMmO*

devlog | twitter

Ultima modifica di Tommo : 04-04-2011 alle 17:03.
Tommo è offline   Rispondi citando il messaggio o parte di esso
Old 04-04-2011, 17:23   #13
Barbalbero
Registered User
 
Iscritto dal: Aug 2006
Messaggi: 305
Quote:
Originariamente inviato da Tommo Guarda i messaggi
Sfortunatamente C++ duplica gran parte delle strutture di C, ma spesso lo fa saltando dei pezzi

Ci sono molti casi in cui quello che si vuole fare è proprio allocare della memoria non inizializzata per un'uso futuro, e in quel caso new oltre a essere lento è anche abbastanza pericoloso; ad esempio se fai new float*[n] ti dovrai ricordare di non chiamare delete, ma delete[].
Che per quanto mi riguarda è una schifezza, ed è anche inutilmente non trasparente rispetto a malloc/free, che se si sa cosa si sta facendo sono molto più chiari e sicuri (allochi n byte, se non riesce da NULL. Punto.).

Per non parlare di tutti quei casi in cui si manovrano i singoli byte, e allora malloc è perfetto.

E tra l'altro nemmeno new[] e delete[] chiamano i costruttori/distruttori

E vogliamo parlare dell'overload di new, o del fatto che new non ha un comportamento definito in caso di errore?

Io più imparo C++ più mi rendo conto di usare un "C con le classi", tanta, troppa roba "avanzata" in C++ è semplicemente stata realizzata male e complica soltanto la vita, partendo dalla STL per finire ai templates.

Quindi pls prima di dire boiate come "lol c'hai C++ usa new" pensateci
concordo in tutto. Inoltre se il problema è solo che la malloc non richiama il costruttore, per allocare struct e array penso che sia molto meglio la malloc rispetto alla new.

Tornando al problema iniziale. L'errore era dovuto al fatto che gli elementi della matrice sono di un tipo definito nella libreria GMP. Se dopo aver chiamato la mpf_clear su ogni elemento della matrice, tento di applicare la free alla matrice mi fa il solito errore double free. Quindi penso che mpf_clear applichi la free anche alla matrice stessa, che ne dite?
Barbalbero è offline   Rispondi citando il messaggio o parte di esso
Old 04-04-2011, 18:32   #14
||ElChE||88
Senior Member
 
Iscritto dal: Dec 2003
Messaggi: 4907
Quote:
Originariamente inviato da Tommo Guarda i messaggi
E tra l'altro nemmeno new[] e delete[] chiamano i costruttori/distruttori
Eh? Ovvio che li chiamano. È proprio per quello che le versioni [] sono separate.

Ultima modifica di ||ElChE||88 : 04-04-2011 alle 18:43.
||ElChE||88 è offline   Rispondi citando il messaggio o parte di esso
Old 04-04-2011, 18:36   #15
WarDuck
Senior Member
 
L'Avatar di WarDuck
 
Iscritto dal: May 2001
Messaggi: 12816
Quote:
Originariamente inviato da Tommo Guarda i messaggi
Io più imparo C++ più mi rendo conto di usare un "C con le classi", tanta, troppa roba "avanzata" in C++ è semplicemente stata realizzata male e complica soltanto la vita, partendo dalla STL per finire ai templates.

Quindi pls prima di dire boiate come "lol c'hai C++ usa new" pensateci
Magari fosse soltanto un C con le classi, invece tocca sorbirsi alcune schifezze sintattiche, per non parlare dei compilatori che dopo tutti questi anni non riescono a tirare fuori messaggi di diagnostica comprensibili agli esseri umani, specie se si usano i template.

Ultima modifica di WarDuck : 04-04-2011 alle 18:39.
WarDuck è offline   Rispondi citando il messaggio o parte di esso
Old 04-04-2011, 19:30   #16
Tommo
Senior Member
 
L'Avatar di Tommo
 
Iscritto dal: Feb 2006
Messaggi: 1304
Quote:
Originariamente inviato da ||ElChE||88 Guarda i messaggi
Eh? Ovvio che li chiamano. È proprio per quello che le versioni [] sono separate.
Testato personalmente, anche se nella classe definisci il costruttore vuoto, comunque non viene chiamato e i valori dentro sono garbage.
Prova e verrai piacevolmente sorpreso
__________________
*ToMmO*

devlog | twitter
Tommo è offline   Rispondi citando il messaggio o parte di esso
Old 04-04-2011, 21:48   #17
||ElChE||88
Senior Member
 
Iscritto dal: Dec 2003
Messaggi: 4907
Quote:
Originariamente inviato da Tommo Guarda i messaggi
Testato personalmente, anche se nella classe definisci il costruttore vuoto, comunque non viene chiamato e i valori dentro sono garbage.
Prova e verrai piacevolmente sorpreso


Codice:
#include <iostream>

class Test
{
public:
	Test() { std::cout << "ctor" << std::endl; };
	~Test() { std::cout << "dtor" << std::endl; };
};

int main(int argc, char **argv)
{
	int count;

	std::cin >> count;

	Test *test = new Test[count];

	delete[] test;

	return EXIT_SUCCESS;
}
Sia costruttore che distruttore vengono chiamati per ciascun elemento.
(codice schifoso, ma è giusto un test)
||ElChE||88 è offline   Rispondi citando il messaggio o parte di esso
Old 04-04-2011, 23:03   #18
tomminno
Senior Member
 
Iscritto dal: Oct 2005
Messaggi: 3306
Quote:
Originariamente inviato da Tommo Guarda i messaggi
Ci sono molti casi in cui quello che si vuole fare è proprio allocare della memoria non inizializzata per un'uso futuro, e in quel caso new oltre a essere lento è anche abbastanza pericoloso; ad esempio se fai new float*[n] ti dovrai ricordare di non chiamare delete, ma delete[].
Se usassi vector,list o array potresti dimenticarti perfino di delete[].

Quote:
Che per quanto mi riguarda è una schifezza, ed è anche inutilmente non trasparente rispetto a malloc/free, che se si sa cosa si sta facendo sono molto più chiari e sicuri (allochi n byte, se non riesce da NULL. Punto.).
Certo buttiamo via i costruttori che non servono proprio a niente...
Chi ti vieta di allocare con new un array di n byte???

Quote:
Per non parlare di tutti quei casi in cui si manovrano i singoli byte, e allora malloc è perfetto.
Eventuali differenze con new???

Quote:
E tra l'altro nemmeno new[] e delete[] chiamano i costruttori/distruttori
Se intendi allocare un array di qualcosa il costruttore di default viene chiamato eccome.

Quote:
E vogliamo parlare dell'overload di new, o del fatto che new non ha un comportamento definito in caso di errore?
A me pare che bad_alloc sia l'eccezione sollevata se new fallisce. Dove starebbe il comportamento indefinito in caso d'errore?

Quote:
Io più imparo C++ più mi rendo conto di usare un "C con le classi", tanta, troppa roba "avanzata" in C++ è semplicemente stata realizzata male e complica soltanto la vita, partendo dalla STL per finire ai templates.
Eh si certo STL e template complicano proprio la vita
Sarà mica appunto che te usi il "C con le classi" invece del C++?

Quote:
Quindi pls prima di dire boiate come "lol c'hai C++ usa new" pensateci
In C++ non esiste ragione per usare malloc al posto di new.
E se te sostieni che è meglio usare malloc forse è il caso di studiarsi un po' meglio il C++, oppure limitarsi a parlare di C.
tomminno è offline   Rispondi citando il messaggio o parte di esso
Old 04-04-2011, 23:08   #19
tomminno
Senior Member
 
Iscritto dal: Oct 2005
Messaggi: 3306
Quote:
Originariamente inviato da Barbalbero Guarda i messaggi
concordo in tutto. Inoltre se il problema è solo che la malloc non richiama il costruttore, per allocare struct e array penso che sia molto meglio la malloc rispetto alla new.
Se vuoi un array usa la classe array.
Inutile continuare con la pessima abitudine di usare malloc in C++.

Quote:
Tornando al problema iniziale. L'errore era dovuto al fatto che gli elementi della matrice sono di un tipo definito nella libreria GMP. Se dopo aver chiamato la mpf_clear su ogni elemento della matrice, tento di applicare la free alla matrice mi fa il solito errore double free. Quindi penso che mpf_clear applichi la free anche alla matrice stessa, che ne dite?
Vedi che era il codice che non avevi postato a creare i problemi?
Data la documentazione mi pare ovvio:
Quote:
Free the space occupied by a NULL-terminated list of mpf_t variables.
tomminno è offline   Rispondi citando il messaggio o parte di esso
Old 05-04-2011, 01:06   #20
Tommo
Senior Member
 
L'Avatar di Tommo
 
Iscritto dal: Feb 2006
Messaggi: 1304
Quote:
Originariamente inviato da ||ElChE||88 Guarda i messaggi
Sul serio, pensavo fosse default. Ma poi un bug mi ha fatto cambiare idea. Non lo so, magari lo fa "a volte"
Bisognerebbe indagare...

@tomminno

Prima di tutto, c'è da dire che uso C/C++ perchè è multipiattaforma, e perchè ha più librerie compatibili di qualsiasi altro linguaggio esistente...
il che rende molto difficile usare allo stesso tempo degli "advanced tricks" di C++ senza complicarsi la vita con librerie di terzi.

ad esempio la std è piuttosto oscena, e preferisco non usarla.
A parte che è lenta, a parte che genera errori incomprensibili, ha anche il problema che non è usata da circa nessuna libreria di terze parti, almeno nel mio ambito.
Alcuni esempi:
-OpenGL
-DirectX
-Win32
-OpenAL
-Box2D
-Havok
-PhysX
-CUDA
-Qt
-l'iphone
-android NDK

in sostanza, quelle librerie che esistono in C/++ per le sue performance, o per la compatibilità con C in genere NON usano STL;
di conseguenza se i dati interni al programma sono immagazzinati in contenitori STL, tutto il codice di interazione diventa un cast, una copia, o peggio... e questo perchè STL ha solo contenitori opachi.
L'unico tipo veramente usato di STL è la stringa, quella si salva... ma in generale la situazione è completamente diversa da Java, e STL fallisce proprio perchè è tutto tranne che standard.

Ovviamente esistono ambiti dove le performance non contano, ma allora li è da malati usare C++ e basta...

I templates complicano la vita sostanzialmente a causa del compilatore, ad esempio in quei casi quando 2 template devono includersi a vicenda.
Bellissimo
Inoltre come sopra generano errori assurdi e uccidono il tempo di compilazione, che per progetti grandi E' importante.
Diverse strutture nei miei progetti non si potrebbero fare senza template, intendiamoci...
ma vanno usati con attenzione e non come fa STL o Boost, perchè a tutti gli effetti sono una feature buggata.

Quote:
Per non parlare di tutti quei casi in cui si manovrano i singoli byte, e allora malloc è perfetto.
Perchè dovrei usare new invece, che è più lento, oltre ad essere meno chiaro.
Mi stai paragonando
Codice:
void* data = (void*)new char[ size ];
a
Codice:
void* data = malloc(size);
insomma. Il primo così, a occhio, è osceno, almeno per quanto mi riguarda. "new" mi dice a pelle "ehi sto allocando un oggetto".
Poi se vuoi usarlo come malloc si può fare, ma per me confonde e basta.

Quote:
A me pare che bad_alloc sia l'eccezione sollevata se new fallisce. Dove starebbe il comportamento indefinito in caso d'errore?
Sapevo che in realtà le implementazioni di C++ restituiscono NULL, comunque non è un problema perchè di tutti i bug, new che fallisce non m'è mai capitato

Comunque sto sito, anche se esagera, fa comunque capire come la penso quando parlo di "inconsistenze"
__________________
*ToMmO*

devlog | twitter

Ultima modifica di Tommo : 05-04-2011 alle 01:17.
Tommo è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Ryzen Threadripper 9980X e 9970X alla prova: AMD Zen 5 al massimo livello Ryzen Threadripper 9980X e 9970X alla prova: AMD...
Acer TravelMate P4 14: tanta sostanza per l'utente aziendale Acer TravelMate P4 14: tanta sostanza per l'uten...
Hisense M2 Pro: dove lo metti, sta. Mini proiettore laser 4K per il cinema ovunque Hisense M2 Pro: dove lo metti, sta. Mini proiett...
Lenovo ThinkPad X1 2-in-1 G10 Aura Edition: il convertibile di classe Lenovo ThinkPad X1 2-in-1 G10 Aura Edition: il c...
Intervista a Stop Killing Games: distruggere videogiochi è come bruciare la musica di Mozart Intervista a Stop Killing Games: distruggere vid...
Xbox: dal prossimo mese verifica dell'id...
Corsair AI Workstation 300: poco pi&ugra...
Addio a Elio Marioli, un pioniere della ...
L'IA sta già diminuendo il potere...
Guida autonoma? Gli ADAS falliscono e in...
Skechers lancia le scarpe per bambini co...
Revolut e Audi F1: un’alleanza rivoluzio...
Gestione attività di Windows 11 d...
Amazon lancia il nuovo videocitofono Bli...
Robot aspirapolvere al top: i nuovi DEEB...
Opera vs Microsoft: la guerra dei browse...
Router e ripetitori FRITZ! in offerta su...
Spotify vola a quota 700 milioni di uten...
Microsoft pronta ad abbandonare il launc...
Windows 11, arriva una feature multimoni...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 04:21.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v