Visual wywala błąd

0

Moze mi ktoś powiedziec co jest nie tak? Dodam, że to program skopiowany z zajęć na których mi wszystko działało
bład z visuala w załączniku

#include "Cliczba.h"
#include <iostream> 
#include "string.h"
using namespace std;


Cliczba::Cliczba(void)
{
	m_fWartosc = 0; 
	AktualizujString();
}


Cliczba::~Cliczba(void)
{
	if(m_csWartoscString!=NULL)
	{
	delete[] m_csWartoscString ;
	m_csWartoscString = NULL ;
	}
}


void Cliczba::Drukuj(void)
{
	cout << m_csWartoscString << endl;
}


void Cliczba::Ustaw_wartosc(double wartosc)
{
	m_fWartosc = wartosc;
	AktualizujString();
}


void Cliczba::AktualizujString()
{
	char buf[100];

	sprintf(buf, "%.*lf", m_iPrecyzja, m_fWartosc);
	if (m_csWartoscString != NULL)
	{
		delete[] m_csWartoscString;
		m_csWartoscString = NULL;
	}
	m_csWartoscString = new char[strlen(buf) + 1];
	strcpy(m_csWartoscString, buf);
}

wywala mi błąd w tym miejscu :

if (m_csWartoscString != NULL)
	{
		delete[] m_csWartoscString;
		m_csWartoscString = NULL;
	}
```![screenshot-20170321231913.png](//static.4programmers.net/uploads/attachment/58/58d1a6e112f7d.png)![screenshot-20170321231913.png](//static.4programmers.net/uploads/attachment/58/58d1a6e112f7d.png)
0

Piszesz po nieswojej pamięci.
Visual ma bardzo dobry debugger. Użyj go.

0

Pokaż plik z main. Zapewne złamałeś zasadę 0/3/5, skopiowałeś i masz double delete. Dlaczego nie powinieneś używać delete/new rozpisałem się tutaj

1

Nie ustawiasz wartości początkowej m_csWartoscString w konstruktorze.

0
#include <iostream>
#include <locale.h>
#include "Cliczba.h"

using namespace std;

int main()
{
	setlocale(LC_ALL, "polish");
	Cliczba liczba(5);
	liczba.Drukuj();
return 0 ; 
} 

to mój main.
Czy metoda AktualizujString() to nie jest ustawianie stringa w konstruktorze?

0

Dodam jeszcze, ze po zakomentowaniu //delete[] m_csWartoscString; Program działa normalnie i nic sie nie dzieje .

0

Błędu nie widać we wklejonym kodzie. Wywala się, bo wskaźnik m_csWartoscString nie jest nullem. Pewnie zadeklarowałeś go mniej więcej w taki sposób:

class Clibczba
{
   public:
   //....
   private:
   char *m_csWartoscString;
};

prawda? Częsty pitfall. Przypisz nulla do tego wskaźnika na początku konstruktora i powinno działać. Inna sprawa, że kod, który piszesz jest przestarzały, @kq podlinkował wpis do swojego bloga, który pomoże Ci unikać takich błędów. Jest TUTAJ.

0

@several: tak uczą na zajęciach, najgorsze jest to, że tak było w instrukcji do zajęć.

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