Wird hier kopiert oder nicht?



  • Hi,
    wenn ich folgenden Code habe, wird in Zeile 16 dann das ganze Objekt kopiert oder nicht?

    struct hugeStruct
    {
        // a lot of data
    }
    
    hugeStruct foo()
    {
        hugeStruct* bar = new hugeStruct;
        // fill bar
        return *bar;
    }
    
    int main()
    {
        // do something
        hugeStruct& otherBar = foo();
        // do something
    }
    


  • Ja, es wird kopiert. Und so wie es da steht, leakt es noch dazu. Ausserdem sollte es eine Warnung bzw. Error geben, weil du einen R-Value an eine non-const Referenz binden möchtest.



  • Wo ist die Referenz denn konstant?



  • weil du einen R-Value an eine non-const Referenz

    deine ist eben nicht const - und wenn Sie const ist kannst du es kompilieren - aber hast dennoch ein Memoryleak durch das new



  • theta schrieb:

    Ausserdem sollte es eine Warnung bzw. Error geben, weil du einen R-Value an eine non-const Referenz binden möchtest.

    Tatsächlich erlaubt Visual Studio sowas als nicht standardkonforme Erweiterung. Man muss schon auf Warning Level 4 stellen damit man wenigstens ne Warnung kriegt. Mach es einfach so und werd glücklich:

    hugeStruct foo()
    {
        hugeStruct bar;
        // fill bar
        return bar;
    }
    
    int main()
    {
        // do something
        hugeStruct otherBar = foo();
        // do something
    }
    

    Wenn der Compiler nicht total steinzeitmäßig ist gibts hier Return Value Optimization.



  • sebi707 schrieb:

    theta schrieb:

    Ausserdem sollte es eine Warnung bzw. Error geben, weil du einen R-Value an eine non-const Referenz binden möchtest.

    Tatsächlich erlaubt Visual Studio sowas als nicht standardkonforme Erweiterung. Man muss schon auf Warning Level 4 stellen damit man wenigstens ne Warnung kriegt.

    War mir schon bewusst, ich war zu faul um noch mehr zu schreiben. 🕶


Anmelden zum Antworten