Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Leica SL2-S: qualità tedesca per foto e video
Leica SL2-S: qualità tedesca per foto e video
Leica SL2-S non è la sorella minore della SL2, ma una fotocamera con un'anima e caratteristiche tecniche profondamente diverse. L'utilizzo di un sensore BSI retroilluminato apre il campo a tutti i formati video fino al 4K 60p, ma offre anche indubbi benefici sul fronte fotografico, con un rapporto segnale/rumore trai i migliori sul mercato
Juice Booster 2 carica i veicoli elettrici con ogni presa della corrente
Juice Booster 2 carica i veicoli elettrici con ogni presa della corrente
Le necessità di ricarica delle batterie dei veicolo elettrici non sempre può essere risolta con una colonnina tradizionale. Giunge in aiuto Juice Booster 2, un caricatore portatile che attraverso una costruzione modulare può diventare compatibile con pressoché tutti i tipi di prese di corrente, sostituendo tanto il cavo per la colonnina come una wallbox nel garage
GeForce RTX 3070 Ti, recensione: Founders Edition vs Inno3D X3 OC
GeForce RTX 3070 Ti, recensione: Founders Edition vs Inno3D X3 OC
La nuova GeForce RTX 3070 Ti di Nvidia si presenta con una GPU GA104 alla massima potenza e memoria GDDR6X a 19 Gbps, anche se sempre 8 GB come la RTX 3070. Si tratta di un leggero miglioramento rispetto alla RTX 3070, ma la RTX 3080 rimane ben staccata. È una soluzione che completa l'offerta di Nvidia, ma che arriva in un momento storico difficile per tutto il mondo della tecnologia a causa della carenza di chip e con prezzi fuori scala.
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: 2219
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: 3166
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 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Leica SL2-S: qualità tedesca per foto e video Leica SL2-S: qualità tedesca per foto e v...
Juice Booster 2 carica i veicoli elettrici con ogni presa della corrente Juice Booster 2 carica i veicoli elettrici con o...
GeForce RTX 3070 Ti, recensione: Founders Edition vs Inno3D X3 OC GeForce RTX 3070 Ti, recensione: Founders Editio...
EnGenius ECS1528P, uno switch PoE a 24 porte ideale per la videosorveglianza EnGenius ECS1528P, uno switch PoE a 24 porte ide...
Sony WF-1000XM4: Noise Cancelling e qualità sonora davvero al top. La recensione Sony WF-1000XM4: Noise Cancelling e qualit&agrav...
RISC-V senza limiti, in futuro la vedrem...
Pagati 28 milioni di dollari per volare ...
Mario + Rabbids Sparks of Hope annunciat...
Avatar Frontiers of Pandora: gioco next-...
Rainbow Six Extraction: gameplay e data ...
Netflix e videogiochi, amore a prima vis...
Star Wars Jedi: Fallen Order next-gen: o...
Il selfie del rover cinese Zhurong e le ...
McLaren parteciperà al campionato...
Death Stranding sbarca anche su PlayStat...
Kingston annuncia il brand FURY: ciao ci...
Nasce l'Agenzia per la cybersicurezza na...
Scoperto un nuovo materiale che non si e...
GPU Kepler addio, Nvidia termina il supp...
Amazon, gli sconti del weekend: tre smar...
LibreOffice 7.1.4
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
Advanced SystemCare Ultimate
PeaZip
Google Chrome Portable
Driver NVIDIA GeForce 466.77 WHQL
ZoneAlarm Antivirus + Firewall
VLC Media Player
Chromium
Opera Portable
Opera 76
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: 08:43.


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