Zugriffsverletzung
-
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
einTForm
ist, ruft das den KonstruktorTdlg_matrix(TComponent* owner)
auf, der das Argument bis zuTControl(TComponent* owner)
durchreicht. Und ein Aufruf mitowner == 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?