Heapverletzung



  • Hallihallo,
    eine simple Frage:

    Wieso bekomme ich hier die Meldung, der Heap würde verletzt?

    std::string itos(int Value) //int to string
    {
        static char *Result = 0;
        if (Result != 0) delete[] Result;
        int Chars = 0;
        for (int i = 1; true; i = i*10)
        {
            if (Value/i < 1) break;
            Chars++;
        }
        Result = new char[Chars];
        printf("%d\n",Result);
        sprintf(Result,"%d",Value);
        return std::string(Result);
    }
    

    lg Max



  • Wieso deklarierst du Result als static? Desweiteren verstehe ich nicht so recht, was diese Zeile bewirken soll:

    if (Result != 0) delete[] Result;
    

    Result wurde doch eine Zeile darüber expliziert als 0 definiert!?



  • std::string itos(int Value) //int to string
    {
        static char *Result = 0;
        if (Result != 0) delete[] Result;
        int Chars = 0;
        for (int i = 1; true; i = i*10)
        {
            if (Value/i < 1) break;
            Chars++;
        }
        Result = new char[Chars];
        printf("%d\n",Result);
        sprintf(Result,"%d",Value);
        return std::string(Result);
    }
    

    (1) Warum static char* Result?
    (2) delete [] ist definiert. if (Result != NULL) ist demnach unnötig.
    (3) unsigned vor "Chars".
    (4)

    for (std::size_t i(1); Value / i == 0; i *= 10)
    

    ...
    (5) Du hast Ganzzahldevision da stehen ... sicher das du das willst?
    (6) std::cout statt std::printf
    (7) %d steht für Integer, nicht für String!

    Wenn du einen Integer in einen String packen willst, dann geht das viel einfacher!

    std::ostringstream ss;
    ss << integer;
    std::string result(ss.str());
    

    .



  • TdZ schrieb:

    Wieso deklarierst du Result als static? Desweiteren verstehe ich nicht so recht, was diese Zeile bewirken soll:

    if (Result != 0) delete[] Result;
    

    Result wurde doch eine Zeile darüber expliziert als 0 definiert!?

    Naja, kann man schon machen ... aber ich halte
    - das in dem Fall vollkommen überflüssig und gefährlich (thread safety ? geschachtelte Aufrufe ? ...)
    - ebenso die Verwendung von char und
    - die gesamte Funktion überhaupt.
    Diese "static"-Verwendung sieht mir nach einem (irgendwo mal gelernten, aber inzwischen veralteten) "Standardtrick aus C-Zeiten" aus.

    Wenn selbst unser char*-Freund (D)Evil schon string(stream)s vorschlägt, wird's eng. ... 😉

    Gruß,

    Simon2.



  • Danke Jungs!

    lg Max


Anmelden zum Antworten