Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Chi è Jen-Hsun 'Jensen' Huang, una vita a fare Nvidia
Chi è Jen-Hsun 'Jensen' Huang, una vita a fare Nvidia
Scopriamo chi è Jen-Hsun 'Jensen' Huang, il CEO di Nvidia, in un racconto non solo della sua vita ma anche legato ai quasi 30 anni di attività ai vertici di un'azienda che ha costruito il mercato dei videogiochi come lo conosciamo per concretizzare una visione che nei primi anni '90 pochi riuscivano a capire.
Google Fuchsia usa un microkernel. Qual è la differenza e perché è rilevante
Google Fuchsia usa un microkernel. Qual è la differenza e perché è rilevante
Google Fuchsia è un nuovo sistema operativo in sviluppo con una particolarità: utilizza Zircon, un microkernel. L'approccio progettuale è piuttosto differente rispetto ai sistemi operativi più diffusi, che usano perlopiù modelli ibridi. Vediamo come un approccio a microkernel potrebbe garantire a Google maggiore controllo sulle sue piattaforme come Android e Chrome OS
Lenovo ThinkVision T34w, ultrawide 34 pollici per la produttività
Lenovo ThinkVision T34w, ultrawide 34 pollici per la produttività
I monitor con formato ultrawide non sono solamente un capriccio per videogiocatori: in ambito professionale e lavorativo permettono di incrementare produttività ed efficienza. Lenovo ThinkVision T34w offre un formato 21:9 e un pannello curvo R1500
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 10-05-2021, 10:19   #1
tuvok01
Junior Member
 
Iscritto dal: May 2021
Messaggi: 1
C++ gestione memoria

Ciao a tutti.

Ho un dubbio che probabilmente è banale.
Allora io ho un processo che, in base ad un evento chiama un metodo di una classe. Il metodo è simile a questo, crea un messagio e lo invia sulla rete:

Codice:
void Manager::doOp() {
    for(int i=0; i <=10; i++) {
        Message* msg = new Message();
        send(msg);
    }
}
Questa parte di codice ogni volta che è chiamata porta ad un memory leak giusto? Per risolverlo dovrebbe bastare mettere una "delete msg" subito dopo la send credo.
Ma nel momento in cui il processo che possedeva l'istanza della classe manager viene terminato, e ne viene poi creato uno nuovo senza terminare il programma. La parte di memoria occupata dai messaggi creati viene liberata?

Grazie.
tuvok01 è offline   Rispondi citando il messaggio o parte di esso
Old 10-05-2021, 11:50   #2
-MiStO-
Senior Member
 
Iscritto dal: May 2005
Città: Trieste
Messaggi: 2222
ciao

senza sapere cosa fa esattamente il metodo send si può solo ipotizzare(magari questo metodo è delegato al cleanup dopo l'effettiva spedizione...), comunque sì, in linea di massima c'è un memleak e va risolto o con una delete oppure, scelta migliore usando smart pointer che semplificano enormemente la vita in operazioni di questo tipo

solitamente la memoria heap è "per-process", quindi viene rilasciata alla chiusura del processo
__________________
metallicgear neo mini v2 / asus rog strix z490i / 10600k@? / noctua uh12s / rx5600xt pulse / 32gb corsair ddr4 3200 / sandisk 250 + asenno 1tb trattative concluse : tante...
-MiStO- è offline   Rispondi citando il messaggio o parte di esso
Old 18-05-2021, 07:47   #3
jepessen
Senior Member
 
L'Avatar di jepessen
 
Iscritto dal: Jul 2007
Città: Sicilia
Messaggi: 3207
Il principio di buona programmazione prevede che la classe che crea un puntatore ne diventa l'owner, quindi dovrebbe essere responsabile anche della sua cancellazione. Quindi una classe/funzione che accetta un puntatore come argomento non dovrebbe cancellarla. Questo principio evita problemi come utilizzo di dangling pointer o memory leak, perche' ogni utilizzatore del puntatore ha la sua responsabilita'.

Se per motivi di design si DEVE spostare l'ownership di un puntatore (ad esempio perche' viene creato da una factory), sarebbe opportuno dirlo esplicitamente, ad esempio con l'utilizzo di un unique_ptr che non puo' essere copiato ma soltanto spostato, quindi passarlo ad una funzione o ad una classe significa esplicitamente che lei ne acquisisce la proprieta' e ne diventa responsabile.

Quindi nel tuo caso "send()" non dovrebbe cancellare il puntatore, ma dovrebbe farlo il tuo manager nel ciclo. Se dovesse per qualche motivo cancellarlo il "send()" allora invece di "Message*" dovresti fare un "std::unique_ptr<Message>" e passarlo per move al send. In questo modo si invalida il puntatore del ciclo for dato che viene "mosso" e non "copiato" all'interno del send, la cui signature diventa "void send(std::unique_ptr<Message>&& message", e quando finira' il suo scope verra' automaticamente cancellato.
__________________
Non abbiamo ereditato il mondo dai nostri padri
L'abbiamo preso in prestito dai nostri figli

Ultima modifica di jepessen : 18-05-2021 alle 07:49.
jepessen è online   Rispondi citando il messaggio o parte di esso
 Rispondi


Chi è Jen-Hsun 'Jensen' Huang, una vita a fare Nvidia Chi è Jen-Hsun 'Jensen' Huang, una vita a...
Google Fuchsia usa un microkernel. Qual è la differenza e perché è rilevante Google Fuchsia usa un microkernel. Qual è...
Lenovo ThinkVision T34w, ultrawide 34 pollici per la produttività Lenovo ThinkVision T34w, ultrawide 34 pollici pe...
realme GT: prestazioni ed esperienza da top di gamma a 399 euro! La recensione realme GT: prestazioni ed esperienza da top di g...
OPPO Find X3 Pro: la prova su ''strada'' con Lamborghini OPPO Find X3 Pro: la prova su ''strada'' con Lam...
Amazon Prime Day 2021: ecco gli articoli...
Prime Day Amazon 2021: SSD, schede memor...
Prezzi mai visti su Samsonite (zaini por...
Amazon Prime Day 2021: i super sconti Ac...
Amazon Prime Day 2021: due giorni di off...
Amazon Prime Day 2021: le migliori offer...
Amazon Prime Day 2021: portatili con GeF...
Amazon Prime Day 2021: le migliori offer...
Amazon Prime Day 2021: gli sconti sui TV...
Amazon Prime Day 2021: realme GT (499€),...
iPhone 12 da 256 GB a 899 Euro e le altr...
Amazon Prime Day 2021: le offerte su Ech...
Amazon Prime Day 2021 scatta a mezzanott...
Ecovacs Deebot N8+ è il robot che...
Tesla Model 3: eccola in versione auto d...
K-Lite Codec Pack Update
K-Lite Mega Codec Pack
K-Lite Codec Pack Full
K-Lite Codec Pack Standard
K-Lite Codec Pack Basic
Firefox Portable
CCleaner Portable
CCleaner Standard
Opera 77
SmartFTP
PCMark 10 Basic Edition
AVG Antivirus Free
Avast! Free Antivirus
Firefox 89
Process Lasso
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: 07:53.


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