[VC] Problem z debuggerem (a raczej ze mną)

0

Komunikat, który pokazuje się przy odpalaniu programu:
[code]---------------------------
Microsoft Visual C++ Debug Library

Debug Assertion Failed!

Program: E:\Jakub\Projekty\VC\Macierz\Macierz\Debug\Macierz.exe
File: dbgdel.cpp
Line: 47

Expression: _BLOCK_TYPE_IS_VALID(pHead->nBlockUse)

For information on how your program can cause an assertion
failure, see the Visual C++ documentation on asserts.

(Press Retry to debug the application)

Przerwij Ponów próbę Ignoruj
---------------------------[/code]

Fragment kodu, przy którym takie coś się pojawia:

CComplex CComplex::operator*(CComplex &c)
{
  if (FCol != c.FRow)
  {
	 CComplex *result = NULL;
	 return *result;
  }

  CMatrix c1 = *FReMacierz*(*(c.FReMacierz));
  CMatrix c2 = *FImMacierz*(*(c.FImMacierz));
  CMatrix c3 = *FReMacierz*(*(c.FImMacierz));
  CMatrix c4 = *FImMacierz*(*(c.FReMacierz));
  c1 -= c2;
  c3 += c4;
  CComplex result(&c1, &c3, FRow, c.FCol);

  return result;
}

Po usunięciu linijki:
CComplex result(&c1, &c3, FRow, c.FCol);
Wszystko gra.
Odpowiedni konstruktor:

CComplex::CComplex(CMatrix *c1, CMatrix *c2, int row, int col)
{
  FReMacierz = c1;
  FImMacierz = c2;
  FRow = row;
  FCol = col;
}

Wydaje mi się, że problem jest z przypisaniem. Po zastąpieniu c1 i c2 przez NULL wszystko gra (zresztą nic w tym dziwnego).
Podam jeszcze destruktory (bo to może być z nimi problem):

CComplex::~CComplex()
{
	if (FReMacierz)
		delete FReMacierz;
	if (FImMacierz)
		delete FImMacierz;
}

CMatrix::~CMatrix()
{
	for (int i=0; i<FRow; i++)
		if (FArray[i])
		delete FArray[i];
	if (FArray)
		delete FArray;
}

Będę wdzięczny za wszelką pomoc.

A i jeszcze coś. Błąd jest wystarczająco skuteczny, że jedyne co widzę na Context to jest NTDLL... i inne bajerki spoza mojego programu.

0

CMatrix c1 = FReMacierz((c.FReMacierz));
CMatrix c2 = FImMacierz(
(c.FImMacierz));
CMatrix c3 = FReMacierz((c.FImMacierz));
CMatrix c4 = FImMacierz(
(c.FReMacierz));
c1 -= c2;
c3 += c4;
CComplex result(&c1, &c3, FRow, c.FCol);

Z tego co widze to sa to zmienne automatyczne wiec wszystkie zostana zdestruowane przy wychodzeniu z metody a to oznacza ze c1 i c2 bedzie usuwany dwa razy !!!! w destruktorze CComplex i w tej metodzie i tutaj jest blad.
Kompilator wie co pisze [diabel]

0

Z tego co widze to sa to zmienne automatyczne wiec wszystkie zostana zdestruowane przy wychodzeniu z metody a to oznacza ze c1 i c2 bedzie usuwany dwa razy !!!!

Że też tego nie zauważyłem. Przerabiałem ze obiektów dynamicznych na automatyczne i się chyba za bardzo rozpędziłem :) Dzięki

Kompilator wie co pisze [diabel]

Nie wątpię, ale mógłby mi się nie wywalać przy debuggowaniu. Pierwszy raz coś takiego mi się zdarzyło (nie licząc dosa, ale tam to mi wywalało całe środowisko :P )

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