У меня проблема с сортировкой. Я сортирую объекты, содержащие динамическую таблицу. Кажется, что stable_sort (или вектор) не использует публичный конструктор копирования. Похоже, они используют несуществующий конструктор без параметров, потому что таблицы внутри объектов освобождены — я думаю.
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
class Dynamic{
int n;
int *tab;
public:
int getN() const{ return n;}
int *getTab() const {return tab;}
Dynamic(int ile){
n=ile;
tab=new int[n];
for(int i=0; i<n; i++)
tab[i] = (10-i)%10;
}
Dynamic(const Dynamic& d){
n = d.getN();
tab = new int[n];
for(int i=0; i<n; i++)
tab[i] = d.getTab()[i];
}
bool operator<(const Dynamic& a) const{
return n < a.getN();
}
~Dynamic(){
delete[] tab;
}
};
int test(vector<Dynamic> & c){
vector<Dynamic> d(c);
stable_sort(d.begin(), d.end());
d.clear();
}
int main(){
vector<Dynamic> c;
c.push_back(Dynamic(15));
test(c);
cout<<"test!";
return 0;
}
Сортировка STL также затронута, но немного более сложным способом.
В g ++ — 4.7.2 я могу это скомпилировать, и в процессе работы я получаю «двойное освобождение или повреждение (fasttop)» / сброс дампа ядра (я думаю, что полный отчет не поможет). В режиме онлайн g ++ — 4.9.0 это выглядит примерно так: «Нет вывода: ошибка: превышен stdout maxBuffer.».
Где моя ошибка? Спасибо за Ваше внимание.
Ну, ты не перегружал operator=
за Dynamic
Таким образом, компилятор неявно определяет тот, который будет делать побитовое копирование. stable_sort()
в вашей библиотеке называет operator=
, так tab
в двоем Dynamic
Объекты указывают на один и тот же адрес, в результате двойное удаление при уничтожении. Перегрузка operator=
решит проблему:
Dynamic& operator =(const Dynamic& d)
{
// or use the copy-and-swap idiom
if(this != &d)
{
delete [] tab;
n = d.getN();
tab = new int[n];
for (int i = 0; i<n; i++)
tab[i] = d.getTab()[i];
}
return *this;
}