Pointer auf operator delete[]



  • Danke für deine Antwort, wegen Kompiler- o. Laufzeitfehler brauchen wir uns nicht zu unterhalten, aber ansonsten muss ich dir weiterhin widersprechen.

    Eine falsche Funktion, die in Wirklichkeit etwas ganz anderes löscht oder tut, kann ich auch einer Functor-Klasse übergeben. Wo siehst du da den Schutz? Verschreiben kann ich mich überall.

    Zweitens spielt es auch keine Rolle, ob eine überladene Funktion übergeben wird.
    1. Beschwert sich der Kompiler dann über ein doppeldeutiges Symbol.
    2. Möchte ich aber unbedingt eine überladene Funktion übergeben, kann ich ja wieder casten:

    void func(int*) {}
    void func(int*, char) {}
    
    MyClass<int> myc5(new int, (void (*)(int*))func);
    

    Ich denke, dass auf diese Art die Typsicherheit gewährleistet ist.

    EDIT:
    ganz nebenbei kann auch std::tr1::function nicht zwischen überladenen Funktionen unterscheiden:

    // Error	1	error C2664: 'std::tr1::function<_Fty>::function(const std::tr1::function<_Fty> &)' : cannot convert parameter 1 from 'overloaded-function' to 'const std::tr1::function<_Fty> &'
    std::tr1::function<void (int*)> myfunc(func);
    

  • Administrator

    FrEEzE2046 schrieb:

    Eine falsche Funktion, die in Wirklichkeit etwas ganz anderes löscht oder tut, kann ich auch einer Functor-Klasse übergeben. Wo siehst du da den Schutz? Verschreiben kann ich mich überall.

    Es geht nicht um einen absoluten Schutz, sondern einer Verminderung der Fehlerquote. Wenn man MyClass<int> erstellt, dann sollte man auch nur Funktionen übergeben können, welche einen int* oder void* erwartet. Bei deiner Version kann man aber halt auch ein char* übergeben, oder sonst irgendeinen Zeiger. Das ist mit boost::function oder std::tr1::function nicht möglich und es ist somit eine Reduzierung der Fehlerwahrscheinlichkeit vorhanden.
    Und das Geile am Ganzen ist, dass du noch zusätzlich weitere Verwendungsmöglichkeiten bekommst.

    Und nun die Frage an dich: Wo siehst du denn bitte die Nachteile, dass du dich so dagegen sträubst und es lieber über wilde und unsaubere Casts machen möchtest?

    FrEEzE2046 schrieb:

    2. Möchte ich aber unbedingt eine überladene Funktion übergeben, kann ich ja wieder casten:

    void func(int*) {}
    void func(int*, char) {}
    
    MyClass<int> myc5(new int, (void (*)(int*))func);
    

    Ich wage sehr stark zu bezweifeln, dass dies gültiges ISO C++ ist. Der Cast darf man sicher machen, ob es allerdings garantiert ist, dass dann die richtige Funktion aufgerufen wird, wage ich wirklich stark zu bezweifeln. Kompilerfehler löst man nicht einfach durch Casts, erst recht nicht durch C Cast. Damit handelst du dir nur Fehler ein.

    FrEEzE2046 schrieb:

    Ich denke, dass auf diese Art die Typsicherheit gewährleistet ist.

    Wie ich schon mehrmals aufgezeigt habe, ist sie das nicht.

    FrEEzE2046 schrieb:

    ganz nebenbei kann auch std::tr1::function nicht zwischen überladenen Funktionen unterscheiden:

    Habe ich schon weiter vorne geschrieben. Weshalb ich ja auch empfohlen habe, lieber ein Standardverhalten einzuführen und einfach delete aufzurufen.

    Die Frage steht oben, aber ich schreibe sie vielleicht besser nochmals hin:
    Wieso willst du nicht std::tr1::function verwenden? Was ist dein Beweggrund?

    Grüssli


  • Mod

    Dravere schrieb:

    FrEEzE2046 schrieb:

    void func(int*) {}
    void func(int*, char) {}
    
    MyClass<int> myc5(new int, (void (*)(int*))func);
    

    Ich wage sehr stark zu bezweifeln, dass dies gültiges ISO C++ ist. Der Cast darf man sicher machen, ob es allerdings garantiert ist, dass dann die richtige Funktion aufgerufen wird, wage ich wirklich stark zu bezweifeln. Kompilerfehler löst man nicht einfach durch Casts, erst recht nicht durch C Cast. Damit handelst du dir nur Fehler ein.

    Das Beispiel ist korrekt, allerdings ist der C-cast abzulehnen. ist func nähmlich ausnahmsweise nicht überladen, hat aber den falschen Typ, wird hier ein Funktionszeiger des falschen Typs erstellt, und MyClass<int> weiß das nat. nicht. Richtig ist in solchen Fällen ein static_cast.

    MyClass<int> myc5(new int, static_cast<void(&)(int*)>(func));
    

Anmelden zum Antworten