Visual wywala błąd

Visual wywala błąd
K2
  • Rejestracja:około 9 lat
  • Ostatnio:prawie 7 lat
  • Postów:77
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

Kopiuj
#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 :

Kopiuj
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)
edytowany 1x, ostatnio: kucia2129
carlosmay
  • Rejestracja:prawie 9 lat
  • Ostatnio:około 5 lat
  • Lokalizacja:Pabianice
0

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


kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:około 13 godzin
  • Lokalizacja:Szczecin
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


06
  • Rejestracja:prawie 20 lat
  • Ostatnio:około rok
  • Postów:2440
1

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

K2
  • Rejestracja:około 9 lat
  • Ostatnio:prawie 7 lat
  • Postów:77
0
Kopiuj
#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?

K2
  • Rejestracja:około 9 lat
  • Ostatnio:prawie 7 lat
  • Postów:77
0

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

several
  • Rejestracja:prawie 16 lat
  • Ostatnio:około 7 godzin
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:

Kopiuj
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.


edytowany 1x, ostatnio: several
K2
  • Rejestracja:około 9 lat
  • Ostatnio:prawie 7 lat
  • Postów:77
0

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

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.