Teknologian jakaminen

Selitys määrittelemättömästä poistamisen ja poistamisen sekoittamisen ongelmasta[]

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Tiedämme, että deleteä käytetään dynaamisen tilan vapauttamiseen ja delete[]:llä useiden dynaamisten välilyöntien vapauttamiseen, mutta mitä ongelmia syntyy, jos niitä sekoitetaan? Olen lukenut monia artikkeleita blogissa, mutta ne eivät ole tyydyttäviä, joten kirjoitin tämän artikkelin kertoakseni sinulle, mikä se on ja miksi (Pinnallinen selitys, korjatkaa minua)。

---------------------------------------------------------------------------------------------------------------------------------

Voimme katsoa ensin esimerkkiä:

Juoksun tulos on:

Mutta jos emme kirjoita tuhoajaa nimenomaisesti:

Tuloksena on normaali toiminta:

---------------------------------------------------------------------------------------------------------------------------------

miksi?

Jos kysyn, kuinka paljon tilaa järjestelmä varaa näille 10 luokan A objektille, vastaat todennäköisesti 40 tavua.Se on helppo ymmärtää. Yksi A on 4 tavua ja 10 on 40 tavua. .Mutta itse asiassa, jos kirjoitat destruktorin itse, varataan yhteensä 44 tavua.

Miksi tuhoajan kirjoittamisen jälkeen on 4 tavua lisää? Tiedämme, että kun poistat tämän tilan, tuhoajaa kutsutaan automaattisesti (http://t.csdnimg.cn/f2FOj), (1) Jos kirjoitamme tuhoajan itse, delete tarvitsee kutsua sitä (Itse asiassa delete on myös funktio, joka vastaa funktion sisäkkäistä kutsua.), kuinka monta kertaa sitä kutsutaan, on kysymys Nämä neljä tavua ovat täsmälleen kokonaisluvun kokoisia. Tätä kokonaislukua käytetään tässä tilassa olevien objektien lukumäärän kirjaamiseen, mikä määrittää kuinka monta kertaa rakentajan ja tuhoajan on oltava. nimeltään.Sinun on kuitenkin tiedettävä, että p-osoitin osoittaa edelleen ensimmäiseen objektiin, mutta se menee eteenpäin saadakseen objektien määrän rakentamisen ja tuhoamisen aikana., erityinen suhde on seuraava:

(2) Jos emme kirjoita destruktoria tällä hetkellä, se kutsuu kääntäjän generoimaa destruktoria tallentamatta monta kertaa (saattaa liittyä alempaa tasoa, en ole varma siitä, korjatkaa minua) ja ei tarvitse avata ylimääräistä plastiikkakirurgiaa.

Okei, nyt voimme selittää yllä olevan esimerkin

Poista vapauttaa oletusarvoisesti tilaa osoittimen osoittamasta paikasta. delete[] tarkistaa ensin, onko lisätilaa avattu oletusarvoisesti, ja jos on, siirtää osoitinta yhden kohdan eteenpäin ennen sen vapauttamista. Jos avaat lisää tilaa tai poistat tilan poistamalla, avattua tilaa ei voida vapauttaa, mikä aiheuttaa muistivuodon, joten virhe raportoidaan.

Saanko virheilmoituksen, jos harjoittelen tätä? :

Ei tarvitse kutsua tuhoajaa, ei tarvitse laskea objektien määrää, eikä tarvitse avata lisää tilaa. Siksi tila voidaan vapauttaa osoittimen osoittamasta paikasta, joten virhettä ei tapahdu raportoitu.

On monia tilanteita, voit mennä alas ja kokeilla sitä itse.

Minulta puuttuu kyky ilmaista itseäni. Lue se muutaman kerran, niin saat varmasti jotain.