• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Malloc - cannot access memory at address

Object Storage Arubacloud
0 głosów
418 wizyt
pytanie zadane 27 stycznia 2018 w C i C++ przez RedRevenge Obywatel (1,230 p.)

Witam,

Spory czas nie zaglądałem do języków C/C++ i napotkałem na pewien problem. Może ktoś mi podpowiedzieć rozwiązanie? Zapewne przegapiłem coś oczywistego.

Błąd ".cannot access memory at address..." występuje w miejscu wywołania linii:
wsk -> Wypisz();

Kod programu:
 

#include <iostream>
#include <stdlib.h>

using namespace std;

class Ksztalt{
public:
    virtual void Wypisz() = 0;
    virtual ~Ksztalt(){
        cout << "Niszcze ksztalt" << endl;
    }
};

class Kwadrat :public Ksztalt{
public:

    static Kwadrat* Create(){
        return (Kwadrat*) malloc(sizeof(Kwadrat));
    }

    virtual void Wypisz(){
        cout << "Jestem kwadrat" << endl;
    }

    ~Kwadrat(){
        cout << "Niszcze kwadrat" << endl;
    }
};

class Prostokat :public Ksztalt{
public:

    static Prostokat* Create(){
        return (Prostokat*) malloc(sizeof(Prostokat));
    }

    virtual void Wypisz(){
        cout << "Jestem prostokat" << endl;
    }

    ~Prostokat(){
        cout << "Niszcze prostokat" << endl;
    }
};

int main()
{
    Ksztalt *wsk;

    wsk = Kwadrat::Create();
    wsk -> Wypisz();
    free(wsk);
    wsk = Prostokat::Create();
    wsk -> Wypisz();
    free(wsk);

    return 0;
}

1 odpowiedź

+1 głos
odpowiedź 27 stycznia 2018 przez the_danger Gaduła (4,800 p.)

malloc jest funkcją z C, która zwraca adres na "surową" pamięć i nie wywołuje żadnych konstruktorów.

W C++ używaj new i delete (ale w nowoczesnym C++ nie używa się "nagiego" new i delete, zamiast tego używa się smart pointerów i vectorów):

class Kwadrat :public Ksztalt{
public:
    static Kwadrat* Create(){
        return new Kwadrat;
    }
};
 
class Prostokat :public Ksztalt{
public:
    static Prostokat* Create(){
        return new Prostokat;
    }
};
 
int main()
{
    Ksztalt *wsk;
 
    wsk = Kwadrat::Create();
    wsk -> Wypisz();
    delete wsk;
    wsk = Prostokat::Create();
    wsk -> Wypisz();
    delete wsk; 
 
    return 0;
}

Jeśli już koniecznie chcesz użyć malloc to poczytaj o placement new.

Podobne pytania

0 głosów
0 odpowiedzi 328 wizyt
0 głosów
0 odpowiedzi 471 wizyt
pytanie zadane 27 czerwca 2019 w C i C++ przez TracerYT Początkujący (440 p.)
+1 głos
0 odpowiedzi 245 wizyt
pytanie zadane 11 lutego 2019 w C i C++ przez Paweł123 Nałogowiec (33,500 p.)

92,584 zapytań

141,434 odpowiedzi

319,671 komentarzy

61,968 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...