Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: c++ muistivuodot

jeepatijee [19.01.2009 16:36:12]

#

Olen koodannut olio-ohjelman Visual Studio 2008:lla. En varaa muistia new-operaattorilla. Kun tarkistan muistivuodot seuraavalla tavalla pääohjelmassa, saan kuitenkin muutaman ilmoituksen muistivuodoista. Jokin minulla on siis jäänyt huomaamatta. Mutta eikös muistia varata dynaamisesti vain new-operaattorilla ja vapauteta delete:llä?

#include <memory>
#define _CRTDBG_MAP_ALLOC
#include <crtdbg.h>

int main()
{
/*koodia*/
_CrtDumpMemoryLeaks();
return 0;
}

hunajavohveli [19.01.2009 17:12:31]

#

Muistia voi varata dynaamisesti myös esim. C:n funktioilla malloc, calloc ja realloc. Lisäksi näitä käyttämällä mikä tahansa funktio voi varata muistia dynaamisesti. Funktion dokumentaatiossa on tavallisesti mainittu, mikäli muistin vapauttaminen on kutsujan vastuulla ja miten vapauttaminen kuuluu hoitaa.

jeepatijee [19.01.2009 17:25:55]

#

hunajavohveli kirjoitti:

Muistia voi varata dynaamisesti myös esim. C:n funktioilla malloc, calloc ja realloc. Lisäksi näitä käyttämällä mikä tahansa funktio voi varata muistia dynaamisesti. Funktion dokumentaatiossa on tavallisesti mainittu, mikäli muistin vapauttaminen on kutsujan vastuulla ja miten vapauttaminen kuuluu hoitaa.

Noita C:n funktioita en ole käyttänyt mutta kiitos vinkistä! Pitää tarkistella muiden käyttämieni funktioiden dokumentaatiot.

Metabolix [19.01.2009 22:24:15]

#

Millähän perusteella tuo funktio edes havaitsee "muistivuotoja"? Luultavasti sillä ei ole mitään keinoa havaita todellisia vuotoja vaan vain varauksia ja vapautuksia, jolloin arvio tietenkin menee tietyltä osin aina metsään.

Lähes mikä tahansa standardikirjaston asia (tiedosto, vektori, lista) varaa sisäisesti muistia, ja näistä olioista ne, jotka on määritelty globaalisti, staattisesti tai main-funktion sisällä, ovat main-funktion loppuun asti olemassa ja voivat siksi luoda illuusion muistivuodoista. Jos et itse ole määritellyt tällaisia olioita, voit ehkä saada todellisemman tuloksen tarkistamalla "muistivuodot" main-funktion alussa ja lopussa ja vertaamalla tuloksia.

Tämän kaiken sanon tuon funktion toimintatapaa tuntematta.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta