[BCB6] Resource type mismatch

0

Witam,

mam vector:

vector<klasa *> vcrLista;

Tworzę kilka klas operatorem new (nothrow).

W destruktorze klasy, w której mam tę wektorową listę CodeGuard pokazuje mi: Resource type mismatch dla kodu:

unsigned int ile = vcrLista.size();
    if(ile){
        klasa * wezel = 0;
        for(unsigned int i = 0; i < ile; i++){

            wezel = vcrLista[i];
            delete wezel;        //<b>Tutaj pokazuje: Resource...</b>
            wezel = 0;
        }
        vcrLista.clear();    // <b>Tutaj też ??!!</b>
    }

Dlaczego?

0

1' zamiast

klasa * wezel = 0;
....
wezel = vcrLista[i];
delete wezel;        //<b>Tutaj pokazuje: Resource...</b>
wezel = 0;

logiczniejsze by bylo:

klasa *& wezel = vcrLista[i];
delete wezel;
wezel = 0;

bo tak naprawde interesuje Cie zerowanie wskaznikow listy, a nie tymczasowego wskaznika

2' co do resourcetypemismatch - jakkolwiek nie uzywam borlanda i nie wiem, to mi to by sugerowalo, ze moze wywolal sie nie ten destruktor co potrzeba? czy wskazniki na liscie sa typu "klasa", czy moze w rzeczywistosci za innym typem dziedziczacym po 'klasa' ? jesli tak, uzyj destruktorow wirtualnych

0

Nie ma dziedziczenia. Dodawanie do listy jest naprawdę proste:

klasa * wezel = new (nothrow) klasa();
if(wezel){
   try{
      vcrLista.push_back(wezel);
   }catch(...){
      // blad
   }
}else{
   / blad
}

Zrobiłem sobie liczniki w konstruktorze i destruktorze. Po skasowaniu listy, wyświetlam ilość utworzonych i skasowanych elementów. Są sobie równe.

Z & jest to samo. Tak jak i wstawiając tylko:
delete (*vcrLista[i]);

0

z & to tylko byla uwaga co do samej implementacji. pewnie juz probowales bez (nothrow) ? moze jakos CodeGuard jest przez niego mylony i zle wykrywa typy obiektow tworzoych/niszczonych

hmm.. dziwaczne. na googlu nic o tym typie bledu nie wyszperalem.. poczekajmy az sie borlandowcy odezwa:)

0

Chyba jakaś literówka jest w tym ostatnim kodzie! nie powinno być tak:

klasa * wezel = new (nothrow) klasa();
if( wezel  ) // tu jest inaczej
  {
   try
      {
      vcrLista.push_back( wezel  ); // tu jest inaczej
      }
   catch(...)
      {
      // blad
      }
   }
else
   {
   // blad
   }

A mieszanie rożnych sposobów obsługi błędów jest brzydkim zwyczajem, więc ładniej jest tak:

try
    {
    std::auto_ptr<klasa> wezel = new klasa();
    vcrLista.push_back( wezel.get() ); // ostatni potencjalny throw
    wezel.release(); // bo przekaz własności do vcrLista
    }
// a powyższa forma dodawania może powodować, że ten catch jest zbędny
catch( std::bad_alloc& exeption ) // stosowanie "catch( ... )" też nie jest zalecane
    {
    // blad
    }

Co do twojego głównego problemu, to bez debugowania całego kodu nic nie da się powiedzieć. Za mało widzimy kodu, a błąd pewnie i tak siedzi głęboko. Może coś napsute jest w destruktorze klasa?.

0

Tak, była pomyłka - poprawiłem.

W destruktorze nie jest raczej nic popsute - cały kod przedstawiłem w pierwszym poście. Tam jest tylko kasowanie wektora.

quetzalcoatl: Tak, to nothrow. Wywaliłem przy dodawaniu do listy i czepia się tylko:
vcrLista.clear();
lista jest w klasie, która jest tworzona też z nothrow, więc raczej to to samo.

MarekR22: auto_ptr w zasadzie pomogłoby mi gdybym miał wycieki, ale kontrolowałem i nie wycieka.

Stawiam na nothrow i myślę, że to koniec.

0

e tam, idzie idzie bez debugowania ;) Wężu, genialną intuicję masz (bo tak, to właśnie nothrow robi błędy), ale w google przeoczyłeś notkę bezpośrednio od Borlanda :O

http://qc.codegear.com/wc/qcmain.aspx?d=3581

MarekR, masz cały w tej notce cały kod do odtworzenia błędu, on jest naprawdę tu, nie gdzie indziej:

 #include <new>

int main(int argc, char* argv[])
{
    int* a = new (std::nothrow) int;
    operator delete(a, std::nothrow); // ze zwykłym delete taki sam błąd
    return 0;
}

W skrócie, kod jest OK, a rozwiązanie podane tam sprowadza się do przeedytowania plików nagłówkowych Buildera

0

oo.. faktycznie, jest o tym info --" pisalem w pospiechu z pracy i przeoczylem :/

heh, wyglada na to, ze mamy w BCB w takim razie 3 pary od zarzadzania pamiecia

  • malloc/free
  • new/delete
  • new nothrow/delete nothrow
    :)
0

A mnie się wydaje, że

       delete wezel ;
       wezel = 0 ;

powinno byc tak:

       delete wezel ;

bez wezel = 0, bo kompilator już nie wie, co to jest wezel, gdyż został już zniszczony. Czy to czasem nie to?

0

@komputer098 "wezel" to wskaznik, a operator delete kasuje obiekt przez niego wskazywany a nie wskaźnik. Dla bezpieczeństwa po kasowaniu ustawia sie wskaźnik na adres 0 żebyś potem przez przypadek nie próbował wpisać danych w miejsce wskazywane przez wskaźnik (bo w tym miejscu nie ma już dawnego obiektu)

0

Och... ciągle się uczymy... dziękuję!

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