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; }
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.
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.
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.
Aihe on jo aika vanha, joten et voi enää vastata siihen.