Dynaamisen struct taulukon vapautus?

Hellou,

Meinaa olla vähän hukassa nuo muistin varaus/vapautus hommelit tietueiden suhteen, niin eipä siinä auta kun kysyä täältä :( Jos joku vaikka tietäis...

Oletetaan että varaan muistia 80 paikkaiselle tietue taulukolle näin:

typedef struct{
UINT glampo;
double dpHeight;
}lMittariData;

data = (lMittariData*)malloc(sizeof(lMittariData)*80);

...ja myöhemmin haluan vapauttaa ko muistin, niin miten homma menee? Tästä ei ohjelma tykännyt:

if(data != 0)
free(data);
8200
Äänestä

Muut lukivat myös

Vastaukset 8

Vanhimmat

ja virheilmoitus oli mikä?

Äänestä

Visual Studio output:
"Windows has triggered a breakpoint in [project name]. This may be due to a corruption of the heap, which indicates a bug in [project name] or any of the DLLs it has loaded.

HEAP[project name]: Heap block at 001E3928 modified at 001E3E58 past requested size of 524

HEAP[project name]: Invalid address specified to RtlValidateHeap( 001E0000, 001E3930 )"

Jos jätän muistin raakasti vapauttamatta niin tätä ilmoitusta ei tule. Sen sijaan tulee seuraava:

"Detected memory leaks!
Dumping objects ->
{58} normal block at 0x009A3950, 1280 bytes long.
Data: 28 00 00 00 CD CD CD CD 00 00 00 00 00 C0 51 40
Object dump complete."

Äänestä

Onkohan sun koodisi ihan kunnossa mallocin ja freen välissä? Ethän muuta data-osoittimen arvoa? Saatko saman virheilmoituksen, jos kommentoit välissä olevat lohkot pois?

Äänestä

Koodissa lisättiin toisessa funktiossa datan muuttujiin arvot tähän tyyliin muistinvarauksen jälkeen:

//for loopissa index < 80
data[index].glampo = arvo1;
data[index].dpHeight = arvo2;

Tämä ei kuitenkaan ohjelmalle passannut :)
Kokeilin myös hoitaa saman globaalilla kaksiulotteisella double taulukolla, josta ohjelma ei myöskään pitänyt vaan virhe oli jotain "access violation blahblah".

Lopuksi sain tarpeeksi ja toteutin saman ihan funktion paikallisella kaksiulotteisella double taulukolla. Oikeastaan tämä oli ihan hyvä ratkaisu, koska huomasin että en olisi edes tarvinnut globaalia muuttujaa.

Jäi kuitenkin vähän kaivelemaan että mikä meni vikaan...

Äänestä
  • Pistä koko ohjelmasi tänne, muuten ei selviä.

    Äänestä

Jokaisen varatun mittaridatan perään pitää varata tila NULlille. NUL on tietokoneen nolla eikä se välttämättä ole yhtäsuuri kuin sinun nollasi

Äänestä

varaa 80 sijaan vaikka 85 paikkaa, toimiiko sitten?

Äänestä

Mites tuo muuttuja data on esitelty?

Äänestä

Kommentoi aloitusta


spapadiidaduuu kirjoitti:

Hellou,

Meinaa olla vähän hukassa nuo muistin varaus/vapautus hommelit tietueiden suhteen, niin eipä siinä auta kun kysyä täältä :( Jos joku vaikka tietäis...

Oletetaan että varaan muistia 80 paikkaiselle tietue taulukolle näin:

typedef struct{
UINT glampo;
double dpHeight;
}lMittariData;

data = (lMittariData*)malloc(sizeof(lMittariData)*80);

...ja myöhemmin haluan vapauttaa ko muistin, niin miten homma menee? Tästä ei ohjelma tykännyt:

if(data != 0)
free(data);

Anonyymi
5000

Ilmoita asiaton sisältö

  • Sisältää materiaalia, joka on loukkaavaa, herjaavaa, rasistista, uhkailevaa tai ahdistelevaa.

  • Materiaali sisältää nimiä, yhteystietoja tai muita henkilökohtaisia tietoja. Julkisuuden henkilöistä, julkisissa viroissa toimivista ihmisistä sekä yritysten vastuuhenkilöistä saa keskustella työhön liittyen. Myös yksityiselämään liittyvistä asioista voi keskustella siltä osin, kuin niistä on julkisesti kerrottu.

  • Sisältää lapsille haitallista tai heiltä kiellettyä materiaalia. Seksuaalinen sisältö on sallittua aiheeseen tarkoitetuilla palstoilla, joiden ikäraja on 18 vuotta.

  • Lainvastaista sisältöä voi olla mm. yksityiselämää loukkaavan tiedon levitys, kiihottaminen kansanryhmää vastaan, laiton uhkaaminen, alaikäisiin liittyvä seksuaalinen sisältö/grooming, petokset, identiteettivarkaudet, kunnianloukkaukset ja tekijänoikeusrikkomukset.

  • Sisältö ei liity palstan tai keskusteluketjun aiheeseen.

  • Viesti ei ole suomea tai ruotsia (pl. International Forums), se sisältää mainontaa, se sisältää tekijänoikeuksin suojattua materiaalia, se on massapostitus tai jokin muu syy.

Jaa keskustelu