Debug Assertion Failure
Ostatnio zmodyfikowano 2015-04-13 14:58
surferpol14 Temat założony przez niniejszego użytkownika |
Debug Assertion Failure » 2015-04-13 13:35:01 Cześć. Piszę program do operacji na wektorach. Problem wygląda tak, że przy uruchomieniu programu, gdy mam przypisać wynik dodawania wektorów do innej zmiennej, wyskakuje mi "Debug Assertion Failure (...) _BLOCK_TYPE_IS_VALID(pHead->nBlockUse) (...)". Tak myślę, że jest to związane z działaniem destruktora, który kasuje pamięć, zanim zmienna zostanie zwrócona przez funkcję, ale nie mam pojęcia jak problem dokładnie wygląda i jak go rozwiązać. Wyciągnąłem takie wnioski, ponieważ wszystko działało, gdy usunąłem destruktor i zwolniłem pamięć po wektorach na końcu programu, używając delete[]. Tylko, że wtedy nic nie zwalnia pamięci po zmiennej lokalnej, która jest w ciele funkcji. Byłbym mega wdzięczny, jak ktoś poradził, co można z tym zrobić. Może powinienem po prostu w jakiś inny sposób przeładować operator? Czy problem wynika z tego, że w ciele funkcji operatorowej tworzę zmienną lokalną "suma", która zostaje usunięta, zanim zostanie zwrócona? Czy powinienem w jakiś sposób zmodyfikować może sam destruktor? Z góry dzięki za pomoc !
#pragma once class wektory { float * vector; int rozmiar; public: wektory( void ); wektory( unsigned int ); ~wektory( void ); wektory operator +( wektory & b ); void wczytaj( void ); void wypisz( void ); };
#include "wektory.h" #include <iostream> using namespace std;
wektory::wektory( void ) { rozmiar = 3; vector = new float[ 3 ]; for( int i = 0; i < rozmiar; i++ ) { vector[ i ] = 0; } } wektory::wektory( unsigned int rozm ) { this->rozmiar = rozm; this->vector = new float[ rozmiar ]; for( int i = 0; i < rozmiar; i++ ) { vector[ i ] = 0; } } wektory::~wektory( void ) { delete[] vector; cout << endl << "DESTRUKTOR" << endl; }
wektory wektory::operator +( wektory & b ) { wektory suma( this->rozmiar ); for( int i = 0; i < suma.rozmiar; i++ ) { suma.vector[ i ] = this->vector[ i ] + b.vector[ i ]; } return suma; } void wektory::wczytaj( void ) { for( int i = 0; i < this->rozmiar; i++ ) { cout << "x" << i << " = "; cin >> this->vector[ i ]; cout << endl; } cout << endl; } void wektory::wypisz( void ) { cout << "["; for( int i = 0; i < this->rozmiar; i++ ) { cout << this->vector[ i ]; if( i != this->rozmiar - 1 ) cout << ","; } cout << "]"; }
#include <iostream> #include "wektory.h" using namespace std;
void main( void ) { wektory a, b, c; a.wczytaj(); b.wczytaj(); c = a + b; c.wypisz(); cin.ignore( INT_MAX, '\n' ); cin.get(); return; }
|
|
michal11 |
» 2015-04-13 13:38:03 Kod w znaczniki.
Edit. Nie masz konstruktora kopiującego. |
|
surferpol14 Temat założony przez niniejszego użytkownika |
» 2015-04-13 14:30:47 Dopisałem konstruktor kopiujący, ale nie rozumiem nadal jak ma to rozwiązać problem. Jak napisać destruktor, żeby nie kasował zmiennej przed zwróceniem jej przez funkcję? |
|
Monika90 |
» 2015-04-13 14:45:52 Masz dwa wyjścia: albo użyć w implementacji klasy std::vector<float> (zalecane), albo prawidłowo zdefiniować konstruktor kopiujący i operator = (trudne). |
|
surferpol14 Temat założony przez niniejszego użytkownika |
» 2015-04-13 14:58:59 Dzięki. Poszukam info jeszcze jak napisać dobrze konstruktor kopiujący i przeładować = . Chodzi o to, że mam napisać swoją klasę do wektorów, a nie korzystać z std::vector . |
|
« 1 » |