Zum Inhalt springen

Heapfehler


Cos

Empfohlene Beiträge

[EDIT: Abgelöst von Haltepunkte | Klotzkopp]

genau die taste war es :-)

aber ich habe mal eine Frage wegen einem Haltepunkt den VC selber erstellt und zwar wenn ein Heap-Fehler auftritt. Kann mir vielleicht jemand sagen wo ich den Fehler suchen muss wenn der Fehlercode folgendermaßen heißt...:


HEAP[box.exe]: Invalid Address specified to RtlValidateHeap( d00000, 12b9b0 )

Leider weiß ich überhaupt nicht wann dieser Fehler das erste mal erschienen ist und was ich zu dem Zeitpunkt geändert habe, da ich dauernd mit dem Debugger gearbeitet habe und nie das Programm bis zum Ende hab laufen lassen, und dieser Fehler erscheint wenn das Programm eigentlich schon vorbei ist. Die Meldung von VC lautet (also eine AFX-Box erscheint)

Benutzerdefinierter Haltepunkt aus Quellcode aufgerufen bei 0x778813b1

danke

Link zu diesem Kommentar
Auf anderen Seiten teilen

Sind das diese "wilden" Zeiger? Na dann wir das ja einen Spass den zu suchen... kann ich den mit der Fehlermeldung in dem dazugehörenden 0x...Code was anfangen. Gibts da einen Anhaltspunkt wo ich mit der Suche beginnne kann. Weil der stoppt beim Debugger nicht im Text-QuellCode sondern in den Assembler-Bereich und da suche ich ja bis in die Unendlichkeit...

Link zu diesem Kommentar
Auf anderen Seiten teilen

Also der CString wird eigentlich kaum genutzt.

Er besorgt mir mit

	m_sInputConvert = m_ldFile.GetPathName();
den Pfad und dann übergebe ich ihn mit

	bool converton = TRUE;

	CABCboxDlg m_change;

	CDisplayConvert m_startconvertdisplay;

	m_change.OnRunabcsplit(m_sInputConvert, converton);

	m_change.OnRunabcwrap(m_sInputConvert, converton);

	m_startconvertdisplay.DoModal()

an die 2 anderen Klassen. Dort wird lediglich eine andere Variable mit

void CABCboxDlg::OnRunabcwrap(CString converterex, bool concheck)


m_sOutput1.Format("%s%s%d%s", converterex, "_OP_", outputcount,".abc");

benannt.

Habe versucht denn CString nach der Operation null-terminated zu machen, aber das hat nicht geholfen. Was funktioniert ist wenn ich den CString aus der Klasse rausnehme und die Übergabe sein lasse...aber ich brauch den CString da dort ein Pfad steht.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Nein die Klasse hat sonst keine andere Variablen, sie ist nur eine kleine Funktion die gestartet wird wenn der Button im fenster gedrückt wird. Der Code vom obigen Post ist der komplette. Es gibt noch 2 andere Funktionen eine Cancel und eine Durchsuchen, die die Datei speichert die ich benötige.

Ich erzeuge keine Instanzen...

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich erzeuge keine Instanzen...
Unwahrscheinlich :D

Das sind schon mal drei:

bool converton = TRUE;
CABCboxDlg m_change;
CDisplayConvert m_startconvertdisplay;[/code]

Eine Instanz von bool, eine von CABCboxDlg und eine von CDisplayConvert. Und irgendwo machst du das mit Sicherheit auch mit der Klasse, zu der m_sInputConvert gehört.
Link zu diesem Kommentar
Auf anderen Seiten teilen

ok geb mich geschlagen :D

was du nicht immer alles über meine programme weißt...

also die m_sInputConvert kommt nur in dem Code vor den du siehst und die Instanz ist in der ConvertOP.h mit CString m_sInputConvert.


public:

	CString m_sInputConvert;

	CConvertOP(CWnd* pParent = NULL);   // Standardkonstruktor

in den anderen Klassen wohin sie kopiert wird erzeuge ich nichts mehr. die Klassen sind definiert mit

afx_msg void OnRunmabcsplit(CString, bool);

afx_msg void OnRunabcwrap(CString, bool);

könnte der Fehler an dem afx_msg liegen? diesen teil habe ich von dem bestehenden Programm übernommen. Das würde vom Programmierer vorher geschreiben.

Link zu diesem Kommentar
Auf anderen Seiten teilen

also die m_sInputConvert kommt nur in dem Code vor den du siehst und die Instanz ist in der ConvertOP.h mit CString m_sInputConvert.

Das ist die Deklaration der Membervariablen. Wo legst du die Instanz von CCOnvertOP an?

Wenn du möchtest (und es keine Probleme mit der Geheimhaltung gibt), kannst du mir auch das Projekt schicken und ich schau mal rein.

Link zu diesem Kommentar
Auf anderen Seiten teilen

so ich denke ich habe was gefunden.


private:

	CConvertOP m_dConvertOP;

Ist es was du sehen wolltest?

void CABCboxDlg::OnConvert() 

{

	m_dConvertOP.DoModal();

}

Ich darf leider keine großen Fragmente des Codes rausgeben...muss auch jedesmal den Code ändern wenn ich hier was poste (Namen von klassen etc.)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hat CABCboxDlg noch andere Member?

Aber Hallo....wenn ich die dir alle hinschreibe bin ich morgen noch dran. das sind mindestens 50 Membervariablen und 15 Funktionen.

Gibt es im Code überhaupt irgendwelche Arrays, auf die über den Index zugegriffen wird?

Es gibt ein paar Arrays die aber nicht in direkter Verbindung stehen mit dem m_sInputConvert. Es muss ja ein Fehler sein der mit dieser Variable in Verbindung gebracht wird.

OH GOTT....jetzt fällt mir gerade noch was ein was ich vergessen habe zu schreiben :eek Das tut mir leid....

Und zwar taucht der Fehler nur auf wenn die Funktion CConvertOP nicht gestartet wird und der ganze Code oben nicht durchlaufen wird...also wenn m_sInputConvert --> converterex (so heißt der CString in der OnRunabcwarp) nicht "gefüllt" wurde....

entschuldige wenn du mir jetzt gerne den Hals umdrehen willst....war das wichtig? :rolleyes:

Link zu diesem Kommentar
Auf anderen Seiten teilen

Es gibt ein paar Arrays die aber nicht in direkter Verbindung stehen mit dem m_sInputConvert. Es muss ja ein Fehler sein der mit dieser Variable in Verbindung gebracht wird.
Nein. Löse dich von dieser Vorstellung. Du versteifst dich darauf, dass der Fehler da passiert, wo er sich bemerkbar macht. Das muss aber nicht so sein.

Und zwar taucht der Fehler nur auf wenn die Funktion CConvertOP nicht gestartet wird und der ganze Code oben nicht durchlaufen wird...
CConvertOP ist eine Klasse, keine Funktion.

Welchen Wert hat eigentlich der "schlechte" Zeiger?

Link zu diesem Kommentar
Auf anderen Seiten teilen

ich meinte die Funktion


void CConvertOP::OnConvertgo() 

die wird nicht gestartet. und die ganze Klasse CConvertOP wird nicht durchlaufen wenn der Fehler auftritt.

Also der Debugger sagt das converterex ohne das durchlaufen der CConvertOP und ohne ausführen von OnConvertgo den Wert {"€Z"} hat

weiter ist angegeben, als Unterpunkt von converterex, m_pchData mit dem Wert 0x0012b9e0 was €Z entsprechen soll.

und ich hätte gerne das converterx keine Informationen enthält wenn OnConvertgo nicht durchlaufen wird. Meinst du das es damit gehen könnte, wenn man converterex keine Wert zuweist?

Link zu diesem Kommentar
Auf anderen Seiten teilen

noch eine kleine Ergänzung. Habe versucht mal dem converterex einen anderenn Wert zuzuweisen und es passierte folgenedes:

Als ersten Versuch.

converterex = ""; // Programm läuft durch bis zum Heapfehler

converterex ="test"; // Fehlermeldung beim Ausführen der Zeile : Debug Assertion Failed! Program :...\abcbox.exe

File:strcore.cpp (die ich nicht mit eingebunden habe)

Line:154

converterex.Format("%s%d", "",0); //gleiche Fehlerbeschreibung allerdings nun in Line 165

Also muss doch schon was bei der Deklaration der Variablen falsch sein wenn ich sie noch nichtmal ändern kann.

Link zu diesem Kommentar
Auf anderen Seiten teilen

File:strcore.cpp (die ich nicht mit eingebunden habe)

Line:154

strcore.cpp ist eine Quellcodedatei der MFC:


void CString::Release()
{
if (GetData() != _afxDataNil)
{
[B]ASSERT(GetData()->nRefs != 0);[/B]
if (InterlockedDecrement(&GetData()->nRefs) <= 0)
FreeData(GetData());
Init();
}
}
[/code]
//gleiche Fehlerbeschreibung allerdings nun in Line 165
[code]void PASCAL CString::Release(CStringData* pData)
{
if (pData != _afxDataNil)
{
[B]ASSERT(pData->nRefs != 0);[/B]
if (InterlockedDecrement(&pData->nRefs) <= 0)
FreeData(pData);
}
}

Zu diesem Zeitpunkt ist dieser CString intern schon "kaputt". Der Fehler passiert also früher.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi Guten Morgen,

das wurde mir gestern zu bunt und ich habe das Problem anders gelöst. ist zwar nicht sonderlich schön aber es geht und das ist das was zählt :D

Habe nun eine Funtkion geschrieben für den Fall das der CString und der bool-wert benötigt wird und eine Funktion die ohne die Übergabe läuft. Und nun tritt der Fehler nicht mehr auf...Ist zwar bissl mehr Code aber was solls...

Aber wie immer vielen Dank für deine Hilfe

Wenn du denkst das dieser Thread noch jemand anderem nutzen kann, kannst du ihn online lassen...wenn nicht, lösch ihn wieder :D

Danke

Cos

Link zu diesem Kommentar
Auf anderen Seiten teilen

Habe nun eine Funtkion geschrieben für den Fall das der CString und der bool-wert benötigt wird und eine Funktion die ohne die Übergabe läuft. Und nun tritt der Fehler nicht mehr auf...
Da wäre ich sehr vorsichtig. Was du gemacht hast, ist offenbar eine Symptombehandlung. Der Fehler ist vermutlich noch da, aber du hast dafür gesorgt, dass er sich vorerst nicht mehr auswirkt. Womöglich überschreibst du jetzt eine andere Variable, bei der das nicht gleich auffällt. Vielleicht wirkt es sich erst dann aus, wenn du von Debug auf Release umstellst. Das ist gefährlich. Je länger du das tatsächliche Beheben dieses Fehlers vor dir herschiebst, desto teurer wird es.
Link zu diesem Kommentar
Auf anderen Seiten teilen

aber meinst du nicht das der fehler daher rühren kann das ich die funktion mit den zwei variablen angesprochen habe ohne dieses zwei variablen zu übergeben? Also es gab ja die funktion abc(cstring,bool) und die wurde angesprochen mit abc() und mit abc(cstring i, bool k) und wenn ich die variablen angeben habe gings wenn ich nur abc() aufgerufen habe kam der Fehler. Nun rufe ich die jeweilige funktion nur mit den variablen auf wenn ich sie brauche ansonsten nehme ich die abc().

ich hätte sowieso nicht gedacht das man eine Funktion die mit abc(Cstring, bool) definiert ist, mit abc() aufrufen kann. Ich dachte immer die funktion erwartet diese variablen...

Link zu diesem Kommentar
Auf anderen Seiten teilen

aber meinst du nicht das der fehler daher rühren kann das ich die funktion mit den zwei variablen angesprochen habe ohne dieses zwei variablen zu übergeben?
Du kannst eine Funktion, die zwei Parameter hat, nicht ohne Parameter aufrufen, Es sei denn, beide Parameter hätten Defaultwerte oder die Funktion hat eine variable Parameterliste (...).

Wie sieht denn die Deklaration von abc aus?

WICHTIGER NACHTRAG (sorry für's Schreien)

Kann es sein, dass die diese Funktion (OnRunabcsplit) eine Nachrichtenbehandlungsfunktion für einen Button oder etwas in der Art ist? Und hast du die Parameter nachträglich hinzugefügt?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...