Przydział pamięci C++

0

Chciałbym dowiedzieć się dlaczego w moim programie operator new w metodzie dolacz(Osoba* osoba) przydziela dokładnie ten sam obszar pamięci co w poprzednim wywołaniu operatora new, przecież z definicji new powinno przydzielać "świeży" obszar pamięci.

#include <iostream>
//#include "../Chusteczka.h"

using namespace std;

#ifndef __OSOBA_H__
#define __OSOBA_H__
struct Osoba{
enum Plec{K,M};
Osoba(Plec p) : plec(p) {}
Plec plec;
};
#endif

// #inlcude "Osoba.h"

#ifndef CHUSTECZKA_H
#define CHUSTECZKA_H

  struct Persona
    {
            bool chusteczka;
            Osoba *Flash;
            bool amwodzirej;
            unsigned int id;

            Persona* right;
            Persona* left;

            Persona(Osoba *F,unsigned int i, bool c, bool w, Persona *r, Persona *l)
            {
                right= r;
                left= l;
                amwodzirej= w;
                chusteczka= c;
                Flash= F;
                id= i;

            }

    };
class Chusteczka
{

public:

        Chusteczka() : idcounter(0)
        {
            wodzirej= new Persona(new Osoba(Osoba::K), idcounter, true, true, 0, 0);  // Tutaj! 1 raz 
            wodzirej->left=wodzirej;
            wodzirej->right=wodzirej;

            current= wodzirej;

            cout << "Moj prawy " << wodzirej->right << endl;
            cout << "Moj lewy " << wodzirej->left << endl;
            cout << "no i ja " << wodzirej << endl;

        }

        ~Chusteczka() // do zrobienia
        {
            delete wodzirej;
        }

        unsigned int dolacz(Osoba* osoba)
        {
            if(osoba == 0) return 0;

            if(!isalready(osoba))
            {

                Persona* tempychuj;

                cout << "Adres tempychuj" << tempychuj << endl;

                wodztest();

                cout << "To: " << new Persona(osoba, ++idcounter, false, false, 0, 0) << endl; // i TU ZLE PRZYDZIELA, wcale nie nowy obszar pamieci :(

                cout << "tempychujright left: " << tempychuj << " " <<  tempychuj->right << " " << tempychuj->left << endl;
                wodztest();

            }
            else return 0;

        }

bool wodztest()
    {
         std::cout << wodzirej->id << endl;

         cout << "Moj prawy " << wodzirej->right << endl;
            cout << "Moj lewy " << wodzirej->left << endl;
            cout << "no i ja " << wodzirej << endl;

        //if (wodzirej->left == wodzirej) std::cout << wodzirej->left->id;
    }

private:

    unsigned int idcounter;

    bool isalready(Osoba* osoba)
    {
        Persona *tmp= wodzirej;
        tmp=tmp->left;

        while(tmp->id != 0)
        {
            //std::cout << tmp->left->id << std::endl;
            if(tmp->Flash == osoba) {delete tmp; return 1;}
            else tmp=tmp->left;

        }

        delete tmp;
        return 0;

    }

    Persona *wodzirej;
    Persona *current;

};

#endif // CHUSTECZKA_H

using namespace std;

int main()
{

    Chusteczka h;
Osoba p(Osoba::K);
Osoba q(Osoba::M);
Osoba r(Osoba::K);
Osoba s(Osoba::M);

//h.wodztest();

cout << h.dolacz(&p);

//h.wodztest();
//cout << h.dolacz(&q);

    cout << "Hello world!" << endl;
    return 0;
}
0

pomijając twoje pytanie, źle to napisałeś: to new leci w kosmos, nigdzie tego nie usuwasz i nie przypisujesz do Persona *tempychuj

0

a jak zarobisz lub dostaniesz jakieś pieniądze, kup sobie książkę "Czysty kod".

albo nie pisz pod wpływem narkotyków

0

Kod był dobry, ładny i składny dopóki nie zacząłem szukać błędu, a że nie mam debuggera to się zrobił bałagan poza tym ten new nie leci w kosmos tylko jest wyswietlany, operator new zwraca adres :P I nie pomijaj pytania _rafale

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0