free funktion liefert Fehler

Von: , Frage gestellt am Sa, 14. Mär 2009

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<iostream>
#include<conio.h>
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

12 Antworten zu dieser Frage

  1. Antwort von nach 11 Stunden 0 hilfreich
    Re: free funktion liefert Fehler

    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)

  2. Antwort von nach 12 Stunden 0 hilfreich
    Re: 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.
    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Б

    • Antwort von nach 14 Stunden 0 hilfreich
      Re^2: fFunktion

      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

      • Antwort von nach 14 Stunden 0 hilfreich
        Re^3: fFunktion

        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Б

        • Antwort von nach 14 Stunden 0 hilfreich
          Re^4: fFunktion

          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

          • Antwort von nach 17 Stunden 0 hilfreich
            Re^5: fFunktion

            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Б

            • Antwort von nach 18 Stunden 0 hilfreich
              Re^6: fFunktion

              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

            • Antwort von nach 18 Stunden 0 hilfreich
              Re^7: fFunktion

              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Б

            • Antwort von nach 18 Stunden 0 hilfreich
              Re^8: Funktion

              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



Keine passende Antwort gefunden? Jetzt eigene Frage stellen!