Destruktor klasy

0

Napisałem sobie program do znajdowania liczb pierwszych.
tak wygląda destruktor który ma usunąć tablicę z pamięci.

public:
bool *array1;
int cRange;
~Sito()
{
delete [] array1;
cout << "Memory ok!\n";
}

To są moje dwa polecenia do usuwania pamięci.
delete program;
albo
program->~Sito();

Ale gdy kompilator dochodzi do tego momentu wyskakuje mi komunikat i po kliknięciu IGNORE pamięć jest zwalniana i działa dalej. Czy ktoś wie jak uniknąć tego komunikatu?

oto komunikat:
http://oi66.tinypic.com/14wzo1f.jpg

Ma ktoś jakieś pomysły?

0

Wskaźnik array1 zawiera śmieci lub wskazuje na już zwolniony obszar.

0

#include "stdafx.h"
#include <iostream>
#include <cstdlib>
#include <string>

using namespace System;
using namespace std;

class Sito
{
private:

public:
	bool *array1;
	int cRange;
	
	~Sito()
	{
		delete [] array1;
		cout << "Memory deleted!\n";
	}
	
	Sito(int nRange)
	{
		cRange = nRange;
		array1 = new bool[nRange];
		for (int i = 2; i < nRange; i++)
		{
			array1[i] = 0;
		}
	}
	
	void Odsiej()
	{
		for (int i = 2; i*i <= cRange; i++) 
			if (!array1[i]) 
				for (int j = i*i; j <= cRange; j += i) 
					array1[j] = 1;
	}

	void Wyswietl()
	{
		cout << "Prime numbers:\n";
		for (int i = 2; i < cRange; i++)
		{	
			if (!array1[i])
				cout << i << " ";
		}
	}

	void Sprawdz(int check)
	{
		for (int i = 2; i < cRange; i++)
		{
			if (i == check)
			{
				if (array1[i] == 0)
					cout << "This is prime nuber!\n";
				else
					cout << "It isn't a prime number!\n";
			}
			else
			{

			}
		}
	}

};

int main(void)
{
cout << " Erestotenes' sieve by Maszaczek.\n\n";
cout << "Set range: ";
int mRange;
cin >> mRange;
Sito *program = new Sito(mRange);

program->Odsiej();
//program->Wyswietl();

cout << "\n\n\nWould you like to check number from 2.." << mRange << " <y/n>: ";
char choice;
cin >> choice;
int check;

if (choice == 'y' || choice == 'Y')
{
	cout << "Which number would you like to check?: ";
	cin >> check;
	program->Sprawdz(check);
}
else
{

}
delete program;

//program->~Sito();

To mój cały kod. Gdzie mogą być śmieci albo gdzie mogło zostać to już usunięte?

1

Kod chyba wygląda dobrze (mówię tutaj o zwalnianiu pamięci). Niepotrzebnie wołałeś ręcznie destruktor obiektu program->~Sito();.
Zauważ, że operatory new / new[], delete / delete[] automatycznie wyłają konstruktor / destruktor. Ręczne robienie tego jest prawie ** nigdy ** niepotrzebne.

3
  1. Zapoznaj się z inkrementacją bo jej nie rozumiesz: http://4programmers.net/Forum/1101404
  2. Odradzam innego niż angielskie nazewnictwa, czemu? Zobacz sam: http://4programmers.net/Forum/1208091
  3. int cRange; czyżby może mieć sens ujemna wartość cRange? Użyj size_t lub przynajmniej unsigned
  4. Czemu w konstruktorze nie inicjalizujesz array1[0] oraz array1[1] ?
  5. Zmienne logiczne inicjalizujemy za pomocą false/true (nie 0/1)
  6. Warunek array1[i] == 0 jest jakimś potworem, wystarczy !array1[i]
  7. Może jakieś sensowniejsze nazewnictwo, zamiast array1 - sito
  8. new bool[nRange] + i*i <= cRange - wyłazisz poza przydzielony zakres
  9. Sito *program = new Sito(mRange); - czemu przydzielasz to dynamicznie? Czemu nie zrobić po ludzku: Sito program(mRange); ?
  10. program->Odsiej(); wywołaj to w konstruktorze.
  11. Sprawdz() - po ludzku powinno wyglądać tak: bool check(size_t value) { return !array1[i]; } - to wystarczy. Jeszcze lepiej przeciążyć operator[]
  12. Wyswietl() - tego nie powinno być w klasie, powinna być na zewnątrz i używać check()
    Po poprawieniu tego jeżeli problem nie zniknie to podaj poprawiony kod.
0

dalej wywala błąd

#include "stdafx.h"
#include <iostream>
#include <cstdlib>
#include <string>

using namespace System;
using namespace std;

class Sito
{
private:

public:
	bool *sito;
	unsigned int cRange;
	
	~Sito()
	{
		delete [] sito;
		cout << "Memory deleted!\n";
	}
	
	Sito(int nRange)
	{
		cRange = nRange;
		sito = new bool[nRange];
		sito[0] = true;
		sito[1] = true;
		for (int i = 2; i < nRange; ++i)
		{
			sito[i] = false;
		}
		Odsiej();
	}
	
	void Odsiej()
	{
		for (int i = 2; i*i < cRange; ++i) 
			if (!sito[i])
				for (int j = i*i; j <= cRange; j += i) 
					sito[j] = true;
	}

	void Wyswietl()
	{
		cout << "Prime numbers:\n";
		for (int i = 2; i < cRange; ++i)
		{	
			if (!sito[i])
				cout << i << " ";
		}
	}

	void Sprawdz(int check)
	{
		for (int i = 2; i < cRange; ++i)
		{
			if (i == check)
			{
				if (!sito[i])
					cout << "This is prime nuber!\n";
				else
					cout << "It isn't a prime number!\n";
			}
			else
			{

			}
		}
	}
	

};

int main(void)
{
cout << " Erestotenes' sieve by Maszaczek.\n\n";
cout << "Set range: ";
int mRange;
cin >> mRange;
//Sito *program = new Sito(mRange);
Sito program(mRange);

//program.Odsiej();
program.Wyswietl();

cout << "\n\n\nWould you like to check number from 2.." << mRange << " <y/n>: ";
char choice;
cin >> choice;
int check;

if (choice == 'y' || choice == 'Y')
{
	cout << "Which number would you like to check?: ";
	cin >> check;
	program.Sprawdz(check);
}
else
{

}
//delete program;

program.~Sito();

	

cout << "\n\n\n\n\n";
system("pause");
return 0;

}

0
_13th_Dragon napisał(a):

Po poprawieniu tego jeżeli problem nie zniknie to podaj poprawiony kod.

Zapomniałeś o Sprawdz() Wyswietl()
I wywał program.~Sito(); - destruktor sam się odpali.

0

Naprawiłem problem. Dzięki!

1 użytkowników online, w tym zalogowanych: 0, gości: 1