Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Debug Assertion Failure

Ostatnio zmodyfikowano 2015-04-13 14:58
Autor Wiadomość
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 !
C/C++
//[wektory.h]
//Klasa przechowująca wektory o dowolnej długości. Póki co, nie dałem żadnych zabezpieczeń przed próbą dodania wektorów o różnej długości,
//wpisywałem takie wartości, żeby się zgadzało, więc to na pewno nie jest problemem.
#pragma once
class wektory
{
    float * vector; //wskaźnik na dyn tab float, przechowujaca wsplrzdn wekt
    int rozmiar;
public:
    wektory( void );
    wektory( unsigned int );
    ~wektory( void );
   
    wektory operator +( wektory & b );
    void wczytaj( void );
    void wypisz( void );
};

//[wektory.cpp]

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


wektory::wektory( void ) // konstruktor bez argumentów, tworzy wekt o dl 3, wypełniony zerami
{
    rozmiar = 3;
    vector = new float[ 3 ];
   
    for( int i = 0; i < rozmiar; i++ )
    {
        vector[ i ] = 0;
    }
}
wektory::wektory( unsigned int rozm ) // konstruktor z argumentem, tworzy wektora o zadanej dl, wypełniony zerami
{
    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 << "]";
}

//[plik_glowny.cpp]

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

void main( void )
{
    wektory a, b, c;
    a.wczytaj();
    b.wczytaj();
   
    c = a + b; // błąd pojawia się tutaj
   
    c.wypisz();
   
    cin.ignore( INT_MAX, '\n' );
    cin.get();
    return;
}
P-130788
michal11
» 2015-04-13 13:38:03
Kod w znaczniki.

Edit.
Nie masz konstruktora kopiującego.
P-130789
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ę?
P-130795
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).
P-130799
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 .
P-130801
« 1 »
  Strona 1 z 1