Debug Assertion Failed, cominciamo bene...

di il
9 risposte

Debug Assertion Failed, cominciamo bene...

Salve a tutti!

Ho appena iniziato a studiare per conto mio il C++, partendo da conoscenze più o meno nulle.

Dopo aver letto qualcosa sull'argomento ho installato Visual Studio Community 2015 RC ed ho iniziato a buttare giù qualche riga.

Uno dei miei primi esperimenti è il seguente:
#include "stdafx.h"

class MyClass {
private:
	int i;
public:
	MyClass() {}
	~MyClass() {
		delete &i;
	}
};

int _tmain(int argc, _TCHAR* argv[])
{
	MyClass* p = new MyClass();
	MyClass m = *p;
	return 0;
}
Il problema è che crasha dando il messaggio di errore che ho allegato (Debug Assertion Failed).

Credo che il problema sia nell'istruzione:
MyClass m = *p;
oppure in
delete &i;
perché se commento una delle due va tutto liscio. Ho provato anche ad assegnare ad i diversi valori, ma non cambia nulla.

Qualcuno sa darmi qualche indicazione?


Allegati:
17816_ea629c56305adef4b9fc67edeccec725.png
17816_ea629c56305adef4b9fc67edeccec725.png

9 Risposte

  • Re: Debug Assertion Failed, cominciamo bene...

    Ma perché quella delete??? Non ha senso...

    Forse è meglio seguire un libro e fare gli esempi consigliati e spiegati passo passo...
  • Re: Debug Assertion Failed, cominciamo bene...

    oregon ha scritto:


    Ma perché quella delete??? Non ha senso...
    Perché non avrebbe senso? Cosa dovrei mettere nel distruttore se delete non va bene?

    oregon ha scritto:


    Forse è meglio seguire un libro e fare gli esempi consigliati e spiegati passo passo...
    Però se mi limito a copiare e incollare codice da un manuale va a finire che dopo poco mi dimentico tutto. Invece imbattendomi in un problema e cercando la soluzione mi ricordo le cose molto meglio.

  • Re: Debug Assertion Failed, cominciamo bene...

    Non devi proprio usare la delete perché non hai allocato i con una new ...

    Il libro *spiega* anche il codice che viene mostrato, applicando le nozioni descritte teoricamente prima di mostrare l'esempio. Quindi non copi-incolli senza comprendere ...

    In questo modo non capisco come tu possa andare avanti, scrivendo codice a caso ...
  • Re: Debug Assertion Failed, cominciamo bene...

    oregon ha scritto:


    Non devi proprio usare il delete perché non hai allocato i con una new ...
    Beh... da questo punto di vista non dovrei nemmeno eseguire il programma proprio perché non fa nulla...
    Il problema sta proprio nel fatto che anche se assegno un valore ad i non cambia ASSOLUTAMENTE NULLA...
    Ad esempio se scrivo:
    
    class MyClass {
    private:
    	int i;
    public:
    	MyClass(int _i) : i(_i) {}
    	~MyClass() {
    		delete &i;
    	}
    };
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	MyClass* p = new MyClass(1);
    	MyClass m = *p;
    	return 0;
    }
    Oppure, volendo usare l'operatore new (che per un int mi pare assurdo, ma potrei essere sicuramente in torto):
    
    class MyClass {
    private:
    	int i;
    public:
    	MyClass(int _i) {
    		i = *new int(_i);
    	}
    	~MyClass() {
    		delete &i;
    	}
    };
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	MyClass* p = new MyClass(1);
    	MyClass m = *p;
    	return 0;
    }
    ottengo sempre un Debug Assertion Failed!

    Ovviamente è chiaro che scritto così il codice non serve a nulla, l'ho semplicemente ripulito da tutto quello che non è necessario per evidenziare meglio le parti che non funzionano.

    oregon ha scritto:


    Il libro *spiega* anche il codice che viene mostrato, applicando le nozioni descritte teoricamente prima di mostrare l'esempio. Quindi non copi-incolli senza comprendere ...
    Infatti spiega talmente bene che pensavo di aver capito, ma come puoi vedere...

    oregon ha scritto:


    In questo modo non capisco come tu possa andare avanti, scrivendo codice a caso ...
    Ehm... quel codice non è stato "scritto a caso", proviene da un sorgente di un centinaio di righe da cui ho eliminato tutto il possibile per riprodurre il problema senza provocarne altri, in modo da rendere più facile possibile per chi legge trovare l'errore.
  • Re: Debug Assertion Failed, cominciamo bene...

    Forse non mi sono spiegato prima ... il codice sembra scritto a caso perché non ha senso fare la delete di una variabile intera usando il suo puntatore. Parliamo delle basi del C++ (e anche del C se parliamo di free ...).

    Quello che ti volevo dire è che questo codice dimostra una evidente mancanza di studio della teoria. Il C++ non è un linguaggio banale che può essere imparato per "tentativi". Devi sapere sempre quello che fai e, a parte alcune banalità, è molto complesso.

    La new non la usi in quel modo. Utilizzi un puntatore scrivendo

    int *p;

    p = new int;

    e alla fine

    delete p;
  • Re: Debug Assertion Failed, cominciamo bene...

    oregon ha scritto:


    La new non la usi in quel modo. Utilizzi un puntatore scrivendo

    int *p;

    p = new int;

    e alla fine

    delete p;
    OK, questa sì che è una risposta coi fiocchi!
    Grazie!

    oregon ha scritto:


    Quello che ti volevo dire è che questo codice dimostra una evidente mancanza di studio della teoria.
    Il problema è che mi hanno dato due settimane per impararlo da zero, e cerco di fare del mio meglio senza scendere troppo nei dettagli, visto il poco tempo che ho a disposizione.
    Ricordo che quando anni fa a scuola studiai Java non c'erano tutte queste magagne coi puntatori...
    A questo punto mi sa che è meglio se rinuncio e torno a fare il contadino...
  • Re: Debug Assertion Failed, cominciamo bene...

    Due settimane per imparare il C++ da zero e da solo, senza libri ... obbligato ...

    Il Java è un'altra cosa ...

    Torni a fare il contadino? In che senso? è uno scherzo?
  • Re: Debug Assertion Failed, cominciamo bene...

    oregon ha scritto:


    Torni a fare il contadino? In che senso? è uno scherzo?
    No, non è uno scherzo. E' solo che (molti) anni fa studiai informatica, ma poi per motivi personali dovetti mollare tutto (pensa che all'esame sul C presi persino 30...) e di conseguenza ora non ricordo più nulla di quello che avevo imparato.
    Ora volevo trovarmi un nuovo lavoro in campo informatico, ma vedo che forse mi sono arrugginito troppo...
  • Re: Debug Assertion Failed, cominciamo bene...

    Non conosco la tua storia, età e tutto il resto ma mi sembra una strada poco praticabile.

    Pensa a qualcosa di più operativo in tempi piú brevi...
Devi accedere o registrarti per scrivere nel forum
9 risposte