Witam.
Mam taki kawałek kodu jak poniżej. Na pierwszy rzut oka wydaje mi się on poprawny lecz ewidentnie coś w nim nie gra (zaznaczyłem to miejsce komentarzem). Przy debugowaniu otrzymuję SIGABRT. Jak poprawić ten kod aby nie dopuszczać do wycieków pamięci oraz żeby wszystko działało poprawnie?
#include <iostream>
#include <vector>
using namespace std;
// ZADANIE 1
class VectorOfIntArray
{
public:
VectorOfIntArray() {}
VectorOfIntArray(VectorOfIntArray& src) {
//this->~VectorOfIntArray();
int i = 0;
while (src.getSize(i) > 0)
{
add(src.get(i), src.getSize(i));
++i;
}
}
~VectorOfIntArray() {
for(int i = 0; i < val.size(); ++i)
{
int * tmp = val[i];
delete[] tmp; /// TA LINIJKA POWODUJE BŁĄD
}
val.clear();
}
int * get(int rowidx) {
if (val.size() <= rowidx)
return NULL;
int * tmp = val[rowidx];
return tmp+1;
}
int getSize(int rowidx) {
if (val.size() <= rowidx)
return -1;
int * tmp = val[rowidx];
return tmp[0];
}
void add(int * tab, int size) {
if (tab && size > 0) {
int * tmp = new int[size+1];
tmp[0] = size;
for (int i = 1; i<=size; ++i)
tmp[i] = tab[i-1];
val.push_back(tmp);
}
}
private:
vector<int*> val;
};
int main()
{
// ZADANIE 1
VectorOfIntArray foo;
int * tmp1 = new int[10];
for (int i = 0; i < 10; ++i) tmp1[i] = i;
foo.add(tmp1, 10);
int * tmp2 = new int[20];
for (int i = 0; i < 20; ++i) tmp2[i] = i;
foo.add(tmp2, 20);
int * tmp3 = new int[11];
for (int i = 0; i < 11; ++i) tmp3[i] = i;
foo.add(tmp3, 11);
int * tmp4 = new int[14];
for (int i = 0; i < 14; ++i) tmp4[i] = i;
foo.add(tmp4, 14);
{
VectorOfIntArray * foo2 = new VectorOfIntArray(foo);
int i = 0;
while (foo2->getSize(i) > 0) {
int * tmp = foo2->get(i);
for (int j = 0; j < foo2->getSize(i); ++j)
cout << tmp[j] << ",";
cout << endl;
++i;
tmp1 = tmp;
}
delete foo2; /// TUTAJ WYWOŁUJĘ NIESZCZĘSNY DESTRUKTOR
}
return 0;
}