你能在这段代码中找到4个字节的内存泄漏吗?

时间:2014-01-27 20:36:00

标签: c++ memory-leaks byte destructor

这是我的第一堂课

class Wiersz
    {
    private:
        char *zawartosc;
    public:
        Wiersz():zawartosc(NULL){}
        Wiersz(const char *z)
        {
            this->zawartosc = new char[strlen(z) + 1];
            strcpy_s(this->zawartosc, (strlen(z) + 1) * sizeof(char) , z);

            zawartosc[strlen(z) ] = '\0';
        }
        void usun()
        {
            delete [] zawartosc;
        }
        ~Wiersz()
        {
            usun();
        }

    };

我的结构是第二类

struct El_tekst
{
    Wiersz *wiersz;
    El_tekst *next;
    El_tekst():next(NULL),wiersz(NULL){}
};

是我的第二堂课

 class Tekst
    {
    protected:
        El_tekst *tekst;
    public:
        Tekst(): tekst(NULL){}
         ~Tekst()
        {
            El_tekst *_rob;
            while(this->tekst != NULL)
            {
                _rob = this->tekst;
                this->tekst = this->tekst->next;

                _rob->wiersz->usun();
                delete _rob;
            }
        }

        Tekst & operator<<(const char *dod_tekst)
        {

            if(this->tekst == NULL)
            {
                this->tekst = new El_tekst();
                this->tekst->wiersz = new Wiersz(dod_tekst);
            }
            else
            {
                El_tekst *_rob = this->tekst;
                while(_rob->next != NULL)
                {
                    _rob = _rob->next;
                }
                (_rob->next) = new El_tekst();
                (_rob->next)->wiersz = new Wiersz(dod_tekst);
            }
            return *this;
        }
    };

这是第3课

class Edytor_tekstu : public Tekst
{
private:
    int numer_aktualnego_wiersza;
public:
    Edytor_tekstu():numer_aktualnego_wiersza(0){}
    ~Edytor_tekstu(){}
};

现在主要功能:

void main()
{
    Edytor_tekstu b;

    b<<"ala";
}

有4个字节的哑内存,我哪里弄错了? 可能我会涂上一些什么样的东西,或者我的析构者真的很糟糕。

1 个答案:

答案 0 :(得分:1)

而不是使用_rob->wiersz->usun();使用delete _rob->weirz;,它也会自动调用usun()。调用第一个删除wiersz包含的一些数据,而不是wiersz本身,它只包含一个4字节指针。如果你包括两行,你将尝试删除wiersz分配两次的内存,这将导致错误。