Free funktion liefert Fehler

Hallo,

Ich habe das Problem das wenn ich einen char Pointer in meinen Programm mit free lösche kommt eine Unterbrechung in meinen Debugger (der von VS 2008 Express Edition). Also ein grüner Pfeil auf die free Funktion. Weiss jemand an was das liegen kann? Hab jetzt einfach nur einen Ausschnitt aus dem Code genommen.

int GetUniversialLink(char \*sUrl, char \*VideoLink)
{
 int length = getZwischenStringLength(sUrl, ".", ".", 0);
 int lengthofLink;
 char \*site;
 site = (char\*)malloc(sizeof(char)\*length);
 getZwischenString(sUrl, ".", ".", site, 0);
 //MessageBox(NULL, site, "", MB\_OK);
 if(checkSame(site, "myvideo") == 1)
 {
 lengthofLink = GetMyVideoLinkLength(sUrl);
 if (VideoLink == NULL)
 {
 free(site);
 site = NULL;
 return lengthofLink;
 }
 else
 {
 free(site);
 site = NULL;
 GetMyVideoLink(sUrl, VideoLink);
 return 0;
 }
 }
 else if(checkSame(site, "youtube") == 1) 
 {
 lengthofLink = GetYoutubeLink(sUrl, NULL);
 if (VideoLink == NULL)
 {
 free(site);
 site = NULL;
 return lengthofLink;
 }
 else
 {
 free(site);
 site = NULL;
 GetYoutubeLink(sUrl, VideoLink);
 return 0;
 }
 }
 else
 {
 MessageBox(NULL, "Fehlerhafter Link. Bitte benutze den direkten Link von der Seite", "Error", MB\_OK);
 return -1;
 }
}

Das mit dem free funktioniert aber in einen kleinen beispiel wie dem

#include
#include

using namespace std;

int main()
{
 char \*pointer = (char\*)malloc(1024);
 pointer = (char\*)realloc(pointer, 1080);
 sprintf(pointer,"%djkdlaöfjkldösfjklö", 1);
 free(pointer);
 pointer = NULL;
 return 0;
}

Weiss jemand an was das liegen kann?

Gruß Michael

Hallo Michael,

Weiss jemand an was das liegen kann?

  1. Wenn lenght == 0 ist, liefert malloc() keinen Zeiger.
    Grundsätzlich muss man den erhaltenen Zeiger von malloc() immer überprüfen:


    ptr = Malloc(1024)
    if (ptr == NULL)
    {
    FehlerBehandlung
    }

  2. getZwischenStringLength() könnte einen Seiteneffekt haben und site unerlaubt verändern.

MfG Peter(TOO)

Hallo,

Ich habe das Problem das wenn ich einen char Pointer in meinen
Programm mit free lösche kommt eine Unterbrechung in meinen
Debugger (der von VS 2008 Express Edition). Also ein grüner
Pfeil auf die free Funktion. Weiss jemand an was das liegen
kann? Hab jetzt einfach nur einen Ausschnitt aus dem Code
genommen.

OK

int length = getZwischenStringLength(sUrl, „.“, „.“, 0);
int lengthofLink;
char *site;
site = (char*)malloc(sizeof(char)*length);

schau mal nach, ob schon:

site = (char*) malloc( sizeof(char) * (length+1) );

reicht. Ansonsten poste doch mal die Funktion
„getZwischenStringLength“.

Weiss jemand an was das liegen kann?

Du schreibst über das Ende des alloziierten Bereichs hinaus?

Grüße

CMБ

Hallo,

Hier ist die getZwischenStringLength funktion.

int getZwischenStringLength(char \*sourcestring, char \*anfang, char \*ende, int firstpos)
{
 char \*pointer;
 void \*pointer2;
 char \*pointer3;
 char \*out;
 int len1, len2, lenb, lenAnfang, posnext, eLen;
 out = NULL;
 pointer = strstr((sourcestring+firstpos), anfang);
 posnext = strlen(anfang)+1;
 pointer2 = strstr(pointer+posnext, ende);
 pointer3 = NULL;
 if (pointer == NULL ||pointer2 == NULL)
 {
 char Meldung[300];
 SetWindowText(static\_status, "Error Code 2.1");
 wsprintf(Meldung, "Der Pointer1 zeigt auf %d\nDer Pointer2 zeigt auf %d", pointer, pointer2);
 MessageBox(NULL, Meldung, "Error", MB\_OK);
 free(pointer);
 free(pointer2);
 free(pointer3);
 free(out);
 pointer = NULL;
 pointer2 = NULL;
 pointer3 = NULL;
 out = NULL;
 exit(0);
 }
 len1 = strlen((char\*)pointer);
 len2 = strlen((char\*)pointer2);
 lenAnfang = strlen(anfang);
 lenb = len1-len2-lenAnfang;
 pointer = pointer+lenAnfang;
 pointer3 = (char\*)malloc((lenb+1));
 if (pointer3 == NULL)
 {
 MessageBox(NULL, "Pointer3 = NULL", "Error", MB\_OK);
 free(pointer);
 free(pointer2);
 free(pointer3);
 free(out);
 pointer = NULL;
 pointer2 = NULL;
 pointer3 = NULL;
 out = NULL;
 exit(0);
 }
 ZeroMemory(pointer3, (lenb+1)\*sizeof(char));
 strncpy((char\*)pointer3, (char\*)pointer, lenb);
 out = (char\*)malloc((lenb+1)\*sizeof(char));
 ZeroMemory(out, (lenb+1)\*sizeof(char));
 wsprintf((char\*)out, "%s\0", pointer3);
 eLen = strlen((char\*)out);
/\* free(pointer);
 free(pointer2);
 free(pointer3);
 free(out);
\*/
 pointer = NULL;
 pointer2 = NULL;
 pointer3 = NULL;
 out = NULL;
 return eLen;
}

Gruß Michael

Hallo,

Hier ist die getZwischenStringLength funktion.

Kann es sein, daß Du in der anderen Funktion „getZwischenString“
den übergebenen Zeiger ‚site‘ schon mal irgendwo löschst?

Ansonsten hbe ich nicht verstanden, was der ganze
Quelltext eigentlich bewirken soll. Kannst Du das
grob (in Worten) umreissen?

Grüße

CMБ

Hallo,

Also die Funktion GetZwischenString und GetZwischenStringLength sind eigentlich gleich, bloss das die eine den String zwischen den zwei eingegebenen Zeichen und GetZwischenStringLength die länge des Strings dazwischen. Also bei einen link wie wie http://www.myvideo.de gibt die GetZwischenStringLength die länge von dem String myvideo zurück und GetZwischenString schreibt dann myvideo in den Speicher der als Ziel angegeben wird. Und das GetUniversialLink macht dann verschiedene Events je nach dem welche seite es ist. Hoffentlich hat hab ich es nicht zu komisch kompliziert.

Gruß Michael

Hallo Michael,

Hier ist die getZwischenStringLength funktion.

Da ist einiges etwas chaotisch.

strstr() ruft NICHT malloc() auf. Du darfst also diese Zeiger nicht mit free() zurückgeben!

Je nach dem was strstr() für ein Resultat liefert, gibst du mit free() schon hier den Speicherblock, welcher in der aurufenden Funktion alloziert wurde wieder zurück, was bei einem zweiten Aufruf von free() zu einem Fehler führt.
Bei anderen Resultaten führt free() schon in dieser Funktion zu einem Fehler.

MfG Peter(TOO)

Hallo,

Also die Funktion GetZwischenString und
GetZwischenStringLength sind eigentlich gleich, bloss das die
eine den String zwischen den zwei eingegebenen Zeichen und
GetZwischenStringLength die länge des Strings dazwischen. Also
bei einen link wie wie http://www.myvideo.de gibt die
GetZwischenStringLength die länge von dem String myvideo
zurück und GetZwischenString schreibt dann myvideo in den
Speicher der als Ziel angegeben wird. Und das
GetUniversialLink macht dann verschiedene Events je nach dem
welche seite es ist.

OK, jeder Aufruf on malloc/free in einer solchen Funktion
ist imho verkehrt, weil unnötig.

Hoffentlich hat hab ich es nicht zu komisch kompliziert.

Schreib doch mal in wenigen Worten, was das
alles machen soll (eine Art kleine Spezifikation).

Grüße

CMБ

Hallo,

Schreib doch mal in wenigen Worten, was das
alles machen soll (eine Art kleine Spezifikation).

Die Funktion GetUniversalLink soll ermitteln welche Internetseite angegeben ist, dies wird mit GetZwischenString gemacht und GetZwischenStringlength wird ermittelt wie viel Speicher man benötigt. Danach soll er je nach Seite den Quellcode durchsuchen, mit den Funktionen GetMyVideoLink und GetYoutubeLink.

Gruß Michael

Hallo,

Schreib doch mal in wenigen Worten, was das
alles machen soll (eine Art kleine Spezifikation).

Die Funktion GetUniversalLink soll ermitteln welche
Internetseite angegeben ist, dies wird mit GetZwischenString
gemacht und GetZwischenStringlength wird ermittelt wie viel
Speicher man benötigt. Danach soll er je nach Seite den
Quellcode durchsuchen, mit den Funktionen GetMyVideoLink und
GetYoutubeLink.

Aha!

Jetzt hast Du geschrieben, was Du glaubst machen zu
müssen, um das Ziel/den Zweck Deines Programms irgend-
wie zu erreichen. Diesen Zweck hast Du aber noch nicht
verraten.

Ich vermute, Du willst einen „Video Link“ mit einem
eigenen Programm unter Verwendung des Winsock2-API
extrahieren. Wenn das so ist, wie kommen denn die
URI’s ins Programm und wo geht der extrahierte Video-
Link dann hin?

Und warum muß man/mußt Du das mit C machen?

Grüße

CMБ

Hallo,

Jetzt hast Du geschrieben, was Du glaubst machen zu
müssen, um das Ziel/den Zweck Deines Programms irgend-
wie zu erreichen. Diesen Zweck hast Du aber noch nicht
verraten.

Also wie du weiter unten schon vermutest will ich den Video Link extrahieren.

Ich vermute, Du willst einen „Video Link“ mit einem
eigenen Programm unter Verwendung des Winsock2-API
extrahieren. Wenn das so ist, wie kommen denn die
URI’s ins Programm und wo geht der extrahierte Video-
Link dann hin?

Der Link kommt über ein Window in das Programm, also über ein EditWindow. Das Programm nimmt dann den Link und lädt den Quellcode runter und wird nach dem Videolink durchsucht.
Der Link vom Video wandert dann zu einer Downloadfunktion die es herunterlädt. Nach dem herunterladen wird der Pfad zu einer Funktion geschickt die es mit FFMPEG umwandelt.

Und warum muß man/mußt Du das mit C machen?

Wie ist diese Frage gemeint? An sich wollte ich mit C++ arbeiten, was kann ich da groß anders machen?

Gruß Michael

Hallo,

Der Link kommt über ein Window in das Programm, also über ein
EditWindow. Das Programm nimmt dann den Link und lädt den
Quellcode runter und wird nach dem Videolink durchsucht.
Der Link vom Video wandert dann zu einer Downloadfunktion die
es herunterlädt. Nach dem herunterladen wird der Pfad zu einer
Funktion geschickt die es mit FFMPEG umwandelt.

Cool. Das meinte ich mit Spezifikation.

Und warum muß man/mußt Du das mit C machen?

Wie ist diese Frage gemeint? An sich wollte ich mit C++
arbeiten, was kann ich da groß anders machen?

C/C++ ist für diese Sachen eher ungeeignet. ffmpeg
ist ein Kommandozeilen-Tool, man könnte also den
Prozess in mehrere Schritte zerlegen:

1 * Sammeln der URI in einer Textdatei (je untereinander)
2 * Durchlaufen der Textdatei => ergibt Flash-Filme im Verzeichnis
3 * Durchlaufen der Flash-Filme und Konvertierung

  1. ist klar; => wie man die Links in die Textdatei bekommt ist Wurst
  2. ist ein Perl-Skript mit 5-10 Zeilen (verwendet LWP, http://search.cpan.org/~gaas/libwww-perl-5.825/
      oder WWW::Mechanize, http://www.catonmat.net/blog/downloading-youtube-vid…)
  3. ist ein Batch-Programm mit 3 Zeilen

Damit hättest Du auch einen automatisierbaren Workflow,
es sei denn, es gibt noch einen anderen Zweck bei
Deinem Programm.

Grüße

CMБ

Hallo,

C/C++ ist für diese Sachen eher ungeeignet. ffmpeg
ist ein Kommandozeilen-Tool, man könnte also den
Prozess in mehrere Schritte zerlegen:

1 * Sammeln der URI in einer Textdatei (je untereinander)
2 * Durchlaufen der Textdatei => ergibt Flash-Filme im
Verzeichnis
3 * Durchlaufen der Flash-Filme und Konvertierung

  1. ist klar; => wie man die Links in die Textdatei bekommt ist
    Wurst
  2. ist ein Perl-Skript mit 5-10 Zeilen (verwendet LWP,
    http://search.cpan.org/~gaas/libwww-perl-5.825/
      oder WWW::Mechanize,
    http://www.catonmat.net/blog/downloading-youtube-vid…)
  3. ist ein Batch-Programm mit 3 Zeilen

Damit hättest Du auch einen automatisierbaren Workflow,
es sei denn, es gibt noch einen anderen Zweck bei
Deinem Programm.

Okay, hört sich schneller an, wollt es aber mit C++ schreiben, da ich C++ mit WinAPI lernen wollte. Hab ein ähnliches Programm schon mit PureBasic geschrieben, aber das mit den was du oben geschrieben hast muss ich mir auch mal anschauen. Danke.

Gruß Michael