• 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

0 głosów
555 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 405 wizyt
0 głosów
0 odpowiedzi 610 wizyt
pytanie zadane 27 czerwca 2019 w C i C++ przez Tracer Użytkownik (560 p.)
+1 głos
0 odpowiedzi 296 wizyt
pytanie zadane 11 lutego 2019 w C i C++ przez Paweł123 Nałogowiec (33,540 p.)

93,630 zapytań

142,552 odpowiedzi

323,056 komentarzy

63,137 pasjonatów

Advent of Code 2025

Top 15 użytkowników

  1. 2416p. - dia-Chann
  2. 2390p. - DziarnowskiJ
  3. 2317p. - raydeal
  4. 2243p. - rucin93
  5. 2242p. - Łukasz Piwowar
  6. 2222p. - CC PL
  7. 2184p. - Adrian Wieprzkowicz
  8. 2082p. - Michal Drewniak
  9. 1957p. - Maurycy W
  10. 1887p. - Łukasz Eckert
  11. 1885p. - robwarsz
  12. 1811p. - rafalszastok
  13. 1600p. - Rafał Trójniak
  14. 1588p. - Tomasz Bielak
  15. 1377p. - ssynowiec
Szczegóły i pełne wyniki

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

Kursy INF.02 i INF.03
...