glibc gedetecteerd dubbel gratis of corruptie

Ik heb een glibc gedetecteerd probleem. Ik heb een manier onderzocht om dit op te lossen, maar het lijkt erop dat de juiste oplossing is om te bevrijden wat ik heb toegewezen. Hoewel ik dit wel doe, ontvang ik nog altijd een geheugenkaartindruk op mijn uitvoerscherm.

class TestDepth{
    gameStatus temp;
public:
    TestDepth(gameStatus ¤tGameState)
    {
        temp = currentGameState;

        free(&temp);
    }
};

Ik krijg deze foutmelding alleen als ik de regel temp = currentGameState plaats. Maar zodra ik dat heb opgemerkt, werkt het prima.

0
En in C ++ is het bijna nooit nodig om gratis (of malloc / calloc ) te gebruiken.
toegevoegd de auteur Oliver Charlesworth, de bron
gratis alleen wat u malloc bent. gratis (& is meestal een bug.
toegevoegd de auteur Piotr Praszmo, de bron

3 antwoord

Zoals u ziet, heb ik een glibc gedetecteerd probleem. Ik heb onderzoek een manier om dit op te lossen, maar het lijkt erop dat de juiste oplossing is om te bevrijden wat ik heb toegewezen.

U wijst niets toe. Je zou niets moeten bevrijden.

5
toegevoegd
@RommelAlonzo: Nee! De ruimte voor het gegevenslid temp bestaat al omdat het exemplaar dat het bevat, al bestaat. Een constructor vult een bestaand object in. Er is niets om toe te wijzen.
toegevoegd de auteur David Hammen, de bron
Ohhhh !! Kk. Dus ik moet het eerst toewijzen voordat ik de informatie kopieer?
toegevoegd de auteur Rommel Alonzo, de bron
Ok, dus wat zou ik moeten doen wat ik wil kopiëren over de informatie die wordt overgebracht van het currentGameStatus-object?
toegevoegd de auteur Rommel Alonzo, de bron

Je bevrijdt niet wat je denkt dat je bevrijdt. Wanneer u temp toewijst, wijst u een exemplaar toe van gameStatus - die niet van de heap kwam. U verwijdert niet de versie van GameStatus die wordt doorgegeven als een argument, u verwijdert een kopie.

Sla de opdracht over naar temp en doe het gewoon

free( ¤tGameState );
1
toegevoegd
Wie weet of temp op de stapel staat? Alles wat we weten is dat het zich op dezelfde plaats bevindt als de instantie TestDepth .
toegevoegd de auteur Dietrich Epp, de bron
U kunt niet garanderen dat & temp geen adres is dat wordt opgegeven door malloc, maar dat is niet waar het om gaat. Het punt is dat je niet kunt garanderen dat het is gegeven door malloc.
toegevoegd de auteur Dietrich Epp, de bron
Je hebt gelijk. Maar je kunt er zeker van zijn dat temp niet op een adres staat dat door de hoop wordt gegeven, en dat was echt mijn punt. Ik zal het antwoord oplossen
toegevoegd de auteur Rafael Baptista, de bron
Ik denk dat hij het argument in de constructor wil verwijderen en de geconstrueerde klasse levend wil houden. Ik weet zeker dat dit een schroot is van een grotere functie. Ik durf te wedden dat het de bedoeling is om een ​​tijdelijke kopie te maken van het doorgegeven argument, het te gebruiken om TestDepth samen te stellen en vervolgens het argument te verwijderen. Maar hij verwijdert de tijdelijke map die waarschijnlijk niet als een klaslid moet worden gemaakt.
toegevoegd de auteur Rafael Baptista, de bron
@David: ook zijn vraag gaat niet over het ontwerp. Wat we niet zo kort kunnen opsommen - maar waarom het gratis falen is.
toegevoegd de auteur Rafael Baptista, de bron
-1. Sla de opdracht over naar temp? Dit is een constructor. Het ding om over te slaan is de vrije -instructie.
toegevoegd de auteur David Hammen, de bron
U heeft hier () nodig. vrij is een normale C-functie. Het is niet hetzelfde als C ++ operator verwijderen .
toegevoegd de auteur Piotr Praszmo, de bron

temp = currentGameState;

Dit roept de opdrachtoperator van gameStatus aan (standaard of uw versie). Als de standaard toewijzingsoperator wordt aangeroepen, zou een beetje verstandige toewijzing hebben plaatsgevonden. Dit is gevaarlijk als het currentGameState -object enkele heap-resources bevat. Als er een toewijzingsoperator is voor gameStatus , heb je hopelijk de vereiste deep-kopie gedaan.

Hoe dan ook, het is niet de bedoeling dat je gratis gebruikt om het object temp te de-alloceren. Eén reden is dat dit niet de juiste manier is om een ​​object te bevrijden. Een andere reden is dat dit kan proberen iets te bevrijden dat niet is toegewezen door malloc .

0
toegevoegd
temp = currentGameState; roept de constructor gameStatus niet aan. Het gegevenslid temp is al standaard geconstrueerd op het punt waarop deze coderegel wordt uitgevoerd. De instructie temp = currentGameState; roept in plaats daarvan de toewijzingsoperator gameStatus aan. Om de kopie-constructor aan te roepen, moet u temp (currentGameState) in de initialisatielijst van de fabrikant plaatsen.
toegevoegd de auteur David Hammen, de bron
@DavidHammen, je hebt gelijk, temp zou standaard geconstrueerd zijn tegen de tijd dat het lichaam van de constructor wordt uitgevoerd. Ik dacht daar gewoon niet aan! mijn antwoord gecorrigeerd, bedankt ...
toegevoegd de auteur Sanish, de bron