Announcement

Collapse
No announcement yet.

Bug in C++ Builder 4 ?

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Bug in C++ Builder 4 ?

    Hallo Leute,<br>
    <br>
    ich habe hier ein Programmteil, das eine Schutzverletzung in Win98 ausloest. Die Meldung verweist auf Modul VCL40.BPL mit Adresse 015f:400085e1. <br>
    <br>
    Das Programmteil sieht so aus : <br>
    char *GetVirtArea(int X, int Y) <br>
    { char *Zeiger ;<br>
    int Groesse ;<br>
    <br>
    Groesse = (X + 1) * (Y + 1) * sizeof(char) ;<br>
    Zeiger = (char *)malloc(Groesse) ;<br>
    reurn(Zeiger) ;<br>
    }<br>
    <br>
    Der Abbruch erfolgt bei der Zeile malloc,wobei die Groesse einen Wert von 15000 aufweist.<br>
    <br>
    Es ist Gleichgueltig ob ich malloc oder new verwende, es wird immer die gleiche Fehlermeldung angezeigt. <br>
    <br>
    Wer weis ob hier ein Bug vorliegt, und wie Abhilfe erfolgen kann?

  • #2
    Hi,

    mir sind auch schon einige Bugs im Builder 4.0 aufgefallen, die durch die SP 3,1 nicht behoben werden. Das betrifft z.B. den += Operator bei mehrdimensionalen Arrays. Die Effekte sind ähnlich wie bei Dir - der Builder wird wegen ungültigen Zugriff geschlossen.
    Was man dagegen tun kann weiss ich auch nicht so genau, ich benutze dann statt x[][] += y[][] einfach x[][] = x[][] + y[][].

    Andrea

    Comment


    • #3
      Hallo Karl-Heinz, Ja, das ist ein Bug ! Aber nicht im Builder, sondern in Deinem Programm. Die lokalen Variablen einer Funktion werden beim return wieder freigegeben. Dein Rückgabewert verweist dann ins Nirwana. Du solltest char *Zeiger entweder global, also außerhalb der Funktion oder innerhalb als

      static *Zeiger=NULL;

      definieren. Beim ersten Aufruf ( Zeiger == NULL ) machst Du ein malloc, danach immer realloc.

      Gruß - Günthe
      Günther

      Comment


      • #4
        Hi,<br>
        also ich habe den Code ausprobiert und bei mir funzt es.

        Günther, was spricht dagegen lokal Speicher anzufordern, den Zeiger zurückliefern und den Speicher dann später wieder freizugeben?<br>
        Man könnte doch auch in einer Fkt return new char[15000]; zurückliefern. Man muss nur zusehen das der angelegte Speicher auch später wieder mit delete[] freigegeben wird. Oder habe ich bisher immer nur Glück gehabt, das es bei mir funzt?

        Gruß Thorste

        Comment


        • #5
          Hallo,

          Da muss ich Thorsten Recht geben, der Code ist so in Ordnung. Es wird beim Verlassen der Funktion ja nur der Speicher, den die lokale Variable belegt, freigegeben. Der über malloc angeforderte Speicher bleibt so lange belegt bis er über free wieder freigegeben wird. Übrigens ein beliebter Programmierfehler, der dann Speicherlecks verursacht.

          Warum Win allerdings abstürzt ist mir ein Rätsel.

          H

          Comment


          • #6
            Sorry ! Ich hatte an meine eigenen negativen Erfahrungen mit char * Funktionen gedacht als ich die Antwort geschrieben habe. Mit etwas mehr Überlegung muß ich auch sagen, daß der Code in Ordnung ist. Und in der Tat, ich habs mal übernommen: bei mir funktioniert es, unter NT und WIN98. Nur das reurn mußte ich in return ändern. Ich hab den Builder 4 Professional mit dem "Update 1". Gruß - Günthe
            Günther

            Comment


            • #7
              Hi,

              ich hatte bei mir auch schon Schutzlerletzungen in dieser Art gehabt. Durch leichtes ändern des Codes konnte ich diese dann überbrücken. Habe für deinen Code war keine Idee, aber vielleicht kannst du ihn ja anders schreiben. Ich hatte mein Problem damals, als ich in einer Anwendung ca. 30 Formulare hatte und einige extra cpp und h mit Code. Nachdem ich diese in der project.cpp einfach anders geordnet habe, weil sie etwas durcheinander waren, lief alles wieder. Vielleicht hat dein Programm doch noch irgendwo eine Schwachstelle, die sich aber nicht so leicht finden läßt.

              Gruß Philip

              Comment

              Working...
              X