Visualizzazione dei risultati da 1 a 10 su 10

Hybrid View

  1. #1
    Non solo, devi implementare anche l'operatore di assegnazione, altrimenti questo:
    codice:
     
    int main()
    {
        ObjectV v1;
        ObjectV v2;
        v2=v1;
        return 0;
    }
    genera un memory leak e una double free.

    Di nuovo: in genere è molto meglio avere solo membri allocati dentro la classe stessa piuttosto che roba allocata nell'heap, oppure aggirare il problema disabilitando costruttore di copia e operatore di assegnazione.
    Ultima modifica di MItaly; 21-05-2014 a 18:49
    Amaro C++, il gusto pieno dell'undefined behavior.

  2. #2
    Utente di HTML.it L'avatar di MrX87
    Registrato dal
    Jun 2007
    Messaggi
    500
    Quote Originariamente inviata da MItaly Visualizza il messaggio
    Non solo, devi implementare anche l'operatore di assegnazione, altrimenti questo:
    codice:
     
    int main()
    {
        ObjectV v1;
        ObjectV v2;
        v2=v1;
        return 0;
    }
    genera un memory leak e una double free.

    Di nuovo: in genere è molto meglio avere solo membri allocati dentro la classe stessa piuttosto che roba allocata nell'heap, oppure aggirare il problema disabilitando costruttore di copia e operatore di assegnazione.
    Okay vero, mi era sfuggito. Comunque seguirò il consiglio di avere solo membri statici dentro la classe, ma era solo per capire meglio il funzionamento delle cose e avere più chiaro il comportamento del codice che scrivo.

    Grazie ancora delle spiegazioni
    "Non può piovere per sempre" Il Corvo
    Forza Vigor!

  3. #3
    Quote Originariamente inviata da MrX87 Visualizza il messaggio
    Okay vero, mi era sfuggito. Comunque seguirò il consiglio di avere solo membri statici dentro la classe,
    Occhio che i campi static sono un'altra cosa...
    ma era solo per capire meglio il funzionamento delle cose e avere più chiaro il comportamento del codice che scrivo.
    Consiglio: ci sono dei casi in cui è necessario tenere dei puntatori nella classe, o comunque dover gestire delle risorse; in questi casi:
    1. se esistono classi che già fanno quello che vuoi fare incapsulando la gestione della memoria, usa quelle; ovvero, non usare vettori allocati con la new, ma std::vector;
    2. se invece hai puntatori ad oggetti di cui la classe è proprietaria, valuta l'uso di smart pointer, ed eventualmente disabilita copia e assegnazione (dichiarandoli come private e non definendoli, cosa che comunque viene da sé se hai come membri degli oggetti non copiabili) se non è necessaria;
    3. se devi gestire risorse (connessioni a DB, handle a risorse, ...), crea una classe wrapper che si occupi solo di quello (e.g. una classe DBConnection), non fare gestire più risorse direttamente alla stessa classe;
    4. nella classe che gestisce direttamente le risorse, se ha senso ed è ben definita una semantica di copia, definisci sempre assieme i "big three" (costruttore di copia, operatore di assegnamento, distruttore); in tal caso, usa il copy and swap idiom invece di inventarti cose strane, è uno dei pochi metodi che sicuramente funziona per implementarli.
    Amaro C++, il gusto pieno dell'undefined behavior.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.