我的排序有问题。我对包含动态表的对象进行排序。似乎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中,我可以编译这个并且在运行中我得到双重免费或腐败(快速顶部)&#34; /核心转储(完整报告并非有用,我认为)。在线g ++ - 4.9.0看起来很相似:&#34;没有输出:错误:超出了stdout maxBuffer。&#34;。
我的错误在哪里?谢谢你的关注。
答案 0 :(得分:0)
嗯,你没有为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;
}