Problem mit delete



  • Erstmal hallo,

    Ich habe folgendes Problem, ich habe mir eine kleine String-Klasse selber gebaut(mit Hilfe der Stringfunktionen der Win-Api). Ich glaube das Problem liegt beim Destruktor der Klasse. Sobald delete auf den char* der Klasse aufgerufen wird stürtzt das Programm ab. Sobald ich diese Zeile auskommentiere tritt der Fehler nicht mehr auf. Der Fehler tritt außerdem nur im Debug-Build auf. Ich bin wirklich am verzweifeln.

    cya noname



  • Kannst du die Stelle mal zeigen? So ohne Beschreibung wird es arg schwierig dir zu helfen.



  • erster gedanke: Vielleicht den Copy-Konstruktur nicht richtig implementiert?
    zweiter gedanke: Nicht das richtige delete? new -> delete, new[] -> delete[], placement new -> placement delete, malloc() -> free()??
    dritter gedanke: delete wird 2 mal aufgerufen? Also wird danach ein schon gelöschter Pointer deletet?
    vierter gedanke: Pointer ist 0? Tu davor mal ein assert oder so, um das zu überprüfen.

    mfg.



  • Ich poste mal den Quelltext:

    // hString.h
    class CString {

    private:

    pchar m_pcString;
    uint32 m_uiLength;

    public:

    CString(void);
    CString(pchar pcString);
    CString(pchar pcString, uint32 uiLength);
    ~CString(void);

    void SetChar(pchar pcString);

    inline pchar GetChar(void) const { return m_pcString; }
    inline uint32 GetLength(void) const { return m_uiLength; }
    inline operator char *(void) const { return m_pcString; }

    CString& operator= (pchar pcString);
    CString& operator= (CString& rsString);

    CString& operator+= (pchar pcString);
    CString& operator+= (CString& rsString);
    };

    // cString.cpp
    #include "hString.h"

    CString::CString(void) {

    m_pcString = NULL;
    m_uiLength = 0;
    }

    CString::CString(pchar pcString) {

    const uint32 iSize = lstrlenA(pcString);

    m_pcString = new char[iSize];

    m_pcString = pcString;

    m_uiLength = iSize;
    }

    CString::CString(pchar pcString,
    uint32 uiLength) {

    const uint32 iSize = uiLength;

    m_pcString = new char[iSize];

    m_pcString = pcString;

    m_uiLength = uiLength;
    }

    CString::~CString(void) {

    if(m_pcString != NULL) {

    delete[] m_pcString;
    m_pcString = NULL;
    }
    }
    ...

    uint32 == unsigned __int32
    pchar == char*

    Ich hoffe das wird helfen



  • Mit m_pcString = pcString hängst Du nur Deinen Pointer um (d.h. der mit new geholte Speicher ist verloren). Du mußt die Daten schon kopieren. Zum Beispiel mit std::copy(pcString, pcString+iSize, m_pcString);

    MfG Jester



  • danke für die antwort, gibt es vielleicht ein win-32 pendant zu der copy funktion
    der standardbibliothek? wollte eigendlich keine std-lib benutzen.



  • Klar, gibt bestimmt ein memcpy oder oder MemCopy oder sowas. Mußt Du halt mal in der MSDN suchen. Notfalls kannst Du die Schleife natürlich auch von Hand schreiben.



  • 0xDEADBEEF schrieb:

    danke für die antwort, gibt es vielleicht ein win-32 pendant zu der copy funktion
    der standardbibliothek? wollte eigendlich keine std-lib benutzen.

    Warum nicht?

    mfg.



  • Jo gibt's, heißt Copy Memory: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/memory/base/copymemory.asp

    Auch wenn mir wirklich nicht klar ist, warum Du auf Standard verzichtest und lieber WinAPI dafür verwendest.

    MfG Jester



  • Hi,

    danke für die antwort. ich versuche die grösse der .exe so klein wie möglich zu halten.

    0xDEADBEEF



  • 0xDEADBEEF schrieb:

    ich versuche die grösse der .exe so klein wie möglich zu halten.

    Dann benutze die stripping Funktion von deinem Compiler, dadurch werden alle Funktionen, die du nicht benutzt, nicht mit in die exe gepackt. Damit kannst du die copy funktion benutzen, ohne dass du die ganzen anderen Sachen mit kriegst.

    mfg.



  • joomoo schrieb:

    ... nicht mit in die exe gepackt.

    natürlich nicht. nur die die du benutzt. und die, die die benutzen. und die, die die benutzen. und die, die die benutzen. und... so weiter.



  • KennerDesStripping schrieb:

    joomoo schrieb:

    ... nicht mit in die exe gepackt.

    natürlich nicht. nur die die du benutzt. und die, die die benutzen. und die, die die benutzen. und die, die die benutzen. und... so weiter.

    Was willst du mir damit sagen?

    mfg.



  • salve,

    joomoo schrieb:

    Was willst du mir damit sagen?
    mfg.

    dass das stripping nicht so toll ist. wegen der/n abhängigkeiten.

    bye.



  • KennerDesStrippings schrieb:

    salve,

    joomoo schrieb:

    Was willst du mir damit sagen?
    mfg.

    dass das stripping nicht so toll ist. wegen der/n abhängigkeiten.

    bye.

    Und was soll da das Problem sein?

    mfg.


Anmelden zum Antworten