Zugriffsverletzung



  • Ciao Zäme

    Mal wieder eine dofe Frage von mir. Aber kann mir jemand erklären warum das folgende nicht funktioniert und wie ich es machen muss damit es funktioniert?

    Deklaration:

    class TStartx
    {
    	private:
    		TStartx();
    		Tdlg_matrix * dlg_matrix;
    	public:
    };
    

    Implemantation:

    dlg_matrix = new Tdlg_matrix( nullptr );
    

    Wenn ich das so ausführe, dann fliegt mir alles um die Ohren. Für viele ist dies logisch für mich nicht.
    Also schon mal danke für eure Hilfe.

    Gruss Renato



  • Wie sieht denn das Fehlverhalten aus? Und wie sieht der Konstruktor von Tdlg_matrix aus?



  • Ciao Heini

    Der Fehler ist eine Zugriffsverlezung (access violation) aber erst zur lauf Zeit. Kommpiliert wird alles klag los.

    Ich habe kein spezieller Konstruktor. Ich Rufe da ein VCL-Formular auf, welches ich zu for Initialisiere das ist schon alles.

    Gruss Renato



  • Hallo
    Was denkst du soll dieses (nullptr) hinter deinem Tdlg_matrix bewirken?
    Hier wird versucht ein neues Tdlg_matrix Objekt auf dem heap zu erzeugen und dabei soll nullptr zur Initialisierung verwendet werden. Was offensichtlich nicht funktionieren kann.

    dlg_matrix = new Tdlg_matrix;
    

    reiucht völlig und sollte funktioneren.
    Vergiss das delete im Destruktor von TStartx nicht. Oder besser, nutze Smartpointer (hier unique_ptr).



  • Braunstein schrieb:

    Hier wird versucht ein neues Tdlg_matrix Objekt auf dem heap zu erzeugen und dabei soll nullptr zur Initialisierung verwendet werden. Was offensichtlich nicht funktionieren kann.

    Ach, nicht? Wenn Tdlg_matrix ein TForm ist, ruft das den Konstruktor Tdlg_matrix(TComponent* owner) auf, der das Argument bis zu TControl(TComponent* owner) durchreicht. Und ein Aufruf mit owner == nullptr ist eigentlich kein Problem.

    Die Ursache liegt irgendwo anders, aber ohne mehr Kontext (wo genau wird TStartx konstruiert? Wie sieht der Rest des Programms aus? Wie sieht der Stacktrace zum Zeitpunkt der Zugriffsverletzung aus?) kann man da nur raten.



  • Er hatte geschrieben, dass kein spezieller Konstruktor existiert. Das hatte ich so interpretiert, dass gar keiner existiert.
    Du hast schon recht. Weniger Interpretation, mehr Information.



  • Braunstein schrieb:

    Er hatte geschrieben, dass kein spezieller Konstruktor existiert. Das hatte ich so interpretiert, dass gar keiner existiert.

    Dann würde der Aufruf aber nicht kompilieren. Der automatisch erzeugte Kopierkonstruktor, den du vermutlich meintest, nimmt eine Referenz und keinen Zeiger.



  • Ja, auch richtig.
    Ich sollte wohl nichts schreiben wenn ich gerade unter Stress bin.



  • So oder so sind die paar Zeilen Code nicht aussagekräftig genug, um einen Zugriffsfehler zu erkennen.



  • Entschuldige bitte, aber ich dachte, dass dieses Problem ein Anfängerfehler ist und durch das schnell gelöst werden kann. Daher nätürlich der volständige code.

    Also mein Form, welches ich aufrufe sieht wie volgt aus:

    class Tdlg_matrix : public TForm
    {
    __published:	// Von der IDE verwaltete Komponenten
    	TProgressBar *pgb_matrix;
    	TLabel *lbl_matrix;
    	TProgressBar *pgb_person;
    	TLabel *lbl_null;
    	TLabel *lbl_halb;
    	TLabel *lbl_ganz;
    private:	// Benutzer-Deklarationen
    public:		// Benutzer-Deklarationen
    	__fastcall Tdlg_matrix(TComponent* Owner);
    };
    

    Die einzige Methode die ich habe ist der Konstruktor und der sieht wie folgt aus:

    __fastcall Tdlg_matrix::Tdlg_matrix(TComponent* Owner)
    	: TForm(Owner)
    {
    }
    

    Beim folgenden Aufruf des Forms kommt es zu einer access violation:

    dlg_matrix = new Tdlg_matrix( nullptr );
    

    Ich hoffe, dass nun die Profis unter euch verstehen was ich machen möchte.

    Gruss Renato



  • Du hast leider nur die uninteressanten Teile des Codes wiedergegeben (nämlich die, die der Form-Wizard eh automatisch generiert) und die interessanten Teile weggelassen (wo steht denn dein Konstruktoraufruf?).

    Magst du außerdem mal einen Stacktrace posten?



  • Wie mache ich einen Stacktrace? Meinst du die Meldungen welche ausgegeben werden.



  • Du solltest dich mal mit den Debugging-Möglichkeiten vertraut machen, s. z.B. Debuggen im Borland C++ Builder



  • Ja das währe bestimmt ein gute Idee.

    In der Zwischenzeit konnte ich das Problem lösen. Ich mache es wie bei einem Splashscreen. Ich habe die Deklaration weggelassen und schon geht es.

    Herzlichen Dank für die vielen guten Ideen.

    Gruss Renato



  • Robbiani schrieb:

    Ja das währe bestimmt ein gute Idee.

    Allerdings. Und daß du dein Problem jetzt gelöst hast, ist kein Grund, die Beschäftigung mit dem Debugger weiter hinauszuschieben. Das nächste Problem kommt bestimmt, und wäre es nicht toll, wenn du es dann einfach durch systematisches Erforschen mit dem Debugger selbst lösen könntest?


Anmelden zum Antworten