[Erledigt] Callback im Konstruktor einer abgeleiteten Klasse setzen



  • Hallo,

    ich kämpfe gerade mit Segmentation Faults und frage mich, ob es damit zusammenhängt, dass ich ein Callback im Konstruktor einer abgeleiteten Klasse setze:

    Foo() : SuperBar()
    {
        m_someMember->setCallback([this](const std::vector<std::string> &ids){
             return SuperBar::bar(ids);
        });
    }
    

    Mir ist bewusst, dass der direkte Aufruf undefiniertes Verhalten ist, aber ich dachte, dass das kein Problem sei, wenn das verzögert aufgerufen wird. D. h., der Callback wird erst dann aufgerufen, wenn der Konstruktor vollständig abgearbeitet wurde.

    Weiß da jemand Bescheid?

    Danke im Voraus!



  • Hallo,

    @Steffo sagte in Callback im Konstruktor einer abgeleiteten Klasse setzen:

    Mir ist bewusst, dass der direkte Aufruf undefiniertes Verhalten ist,

    Der Aufruf wovon? SuperBar::bar(ids)? Nein, das ist nicht undefiniert.
    m_someMember ist in dem gezeigten Code nicht gültig, aber sonst ist da erstmal nichts zu sehen.


  • Mod

    Unabhänhig davon: Ein Segmentation Fault sollte sich doch ganz gut gebuggen lassen, an welcher Stelle genau welcher ungültige Pointer referenziert wird. Und wenn man das weiß, ist meistens auch leicht auf die Ursache zu schließen. Wenn du noch nie einen Debugger benutzt hast, wird es höchste Zeit!



  • @Jockelx sagte in Callback im Konstruktor einer abgeleiteten Klasse setzen:

    Der Aufruf wovon? SuperBar::bar(ids)? Nein, das ist nicht undefiniert.

    Ich hatte vergessen zu sagen, dass SuperBar::bar(ids) eine virtuelle Methode ist.

    m_someMember ist in dem gezeigten Code nicht gültig, aber sonst ist da erstmal nichts zu sehen.

    Auf die Member-Variable bin ich ein­fach­heits­hal­ber nicht weiter darauf eingegangen.

    @SeppJ sagte in Callback im Konstruktor einer abgeleiteten Klasse setzen:

    Unabhänhig davon: Ein Segmentation Fault sollte sich doch ganz gut gebuggen lassen, an welcher Stelle genau welcher ungültige Pointer referenziert wird. Und wenn man das weiß, ist meistens auch leicht auf die Ursache zu schließen. Wenn du noch nie einen Debugger benutzt hast, wird es höchste Zeit!

    Ich bin schon die ganze Zeit am Debuggen. - Sogar mit Kollegen und valgrind. 😉
    So einfach ist das in einem sehr großen Projekt leider nicht. Die Ursache ließ sich bis dato nicht punktuell eingrenzen.



  • @Steffo sagte in Callback im Konstruktor einer abgeleiteten Klasse setzen:

    Ich hatte vergessen zu sagen, dass SuperBar::bar(ids) eine virtuelle Methode ist.

    Das ist egal, ist trotzdem alles in Ordnung.



  • @Jockelx Ok, danke, dann kann ich diese Stelle nun ausschließen. 👍🏻



  • Der Callback hatte eine Referenz auf ein gelöschtes Objekt!
    Das fiel erst mal nicht weiter auf, weil es von dem gelöschten Objekt eine Kopie gab. Ich musste dann Pointer-Adressen vergleichen, um festzustellen, dass der Callback auf ein veraltetes, gelöschtes Objekt verwies.


  • Mod

    PS: Dann hat es sich wohl gelöst, während ich schrieb, aber ich lass den Beitrag mal trotzdem für die Nachwelt stehen.

    @Steffo sagte in [Erledigt] Callback im Konstruktor einer abgeleiteten Klasse setzen:

    Ich bin schon die ganze Zeit am Debuggen. - Sogar mit Kollegen und valgrind. 😉
    So einfach ist das in einem sehr großen Projekt leider nicht. Die Ursache ließ sich bis dato nicht punktuell eingrenzen.

    Aber du bekommst einen eindeutigen Stacktrace auf einen Aufruf des Callbacks? Oder warum fragst du speziell danach?

    Falls du es nicht wusstest: valgrind hat auch einen Tracker für wo ein Wert her kommt, der nicht Teil der Standardanalysen ist. Recht langsam (daher am besten Programm ordentlich abspecken), aber habe schon viele subtile Probleme damit gefunden.

    Falls dir diese Tipps zu blöd sind: Das liegt daran, dass du recht wenig konkretes sagst, daher versucht man es halt erst einmal mit möglichst allgemeinen Tipps, und möchte sicher gehen, dass du nichts offensichtliches übersehen hast.



  • @SeppJ sagte in [Erledigt] Callback im Konstruktor einer abgeleiteten Klasse setzen:

    PS: Dann hat es sich wohl gelöst, während ich schrieb, aber ich lass den Beitrag mal trotzdem für die Nachwelt stehen.

    @Steffo sagte in [Erledigt] Callback im Konstruktor einer abgeleiteten Klasse setzen:

    Ich bin schon die ganze Zeit am Debuggen. - Sogar mit Kollegen und valgrind. 😉
    So einfach ist das in einem sehr großen Projekt leider nicht. Die Ursache ließ sich bis dato nicht punktuell eingrenzen.

    Aber du bekommst einen eindeutigen Stacktrace auf einen Aufruf des Callbacks? Oder warum fragst du speziell danach?

    Ja, den bekomme ich, aber Funktionen wurden schon längst abgearbeitet und vieles lässt sich dann nicht mehr nachvollziehen.
    Der Fehler ist jedenfalls, wie weiter oben schon beschrieben, Gott sei Dank gefunden.

    Falls du es nicht wusstest: valgrind hat auch einen Tracker für wo ein Wert her kommt, der nicht Teil der Standardanalysen ist. Recht langsam (daher am besten Programm ordentlich abspecken), aber habe schon viele subtile Probleme damit gefunden.

    Danke. Ich glaube, das wird in CLion schon angezeigt. Fand ich auch sehr interessant.
    Valgrind ist schon ein gutes Tool, wo ich schon mit dem Memcheck Race Conditions gefunden habe, obwohl es dafür nicht primär gedacht ist.

    Falls dir diese Tipps zu blöd sind: Das liegt daran, dass du recht wenig konkretes sagst, daher versucht man es halt erst einmal mit möglichst allgemeinen Tipps, und möchte sicher gehen, dass du nichts offensichtliches übersehen hast.

    Ja, kein Problem.


Log in to reply