2014-04-23 6 views
0

정렬에 문제가 있습니다. 내가 동적 테이블을 포함하는 개체를 정렬합니다. stable_sort (또는 벡터)가 공용 복사본 생성자를 사용하지 않는 것 같습니다. 개체 안의 테이블이 해제되기 때문에 매개 변수가없는 존재하지 않는 생성자를 사용하는 것 같습니다.동적 테이블을 포함하는 개체의 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 나는 이것을 컴파일 할 수 있고 "double free 또는 corruption (fasttop)"/ 코어가 덤프 됨 (전체 보고서가 도움이되지 않는다고 생각합니다). 온라인 g ++ - 4.9.0에서도 비슷한 모습입니다 : "출력 없음 : 오류 : stdout maxBuffer가 초과되었습니다.".

내 실수는 어디에서 왔습니까? 관심을 가져 주셔서 감사합니다.

+0

세의 통치 특히 연산 = 좋은 조언을 – PlasmaHH

+0

감사를 봐! – Mat

답변

0

글쎄, 을 Dynamic으로 오버로드하지 않았기 때문에 컴파일러는 암시 적으로 비트 복사를 수행 할 코드를 정의합니다. 귀하의 도서관에있는 stable_sort()operator=을 호출하므로 두 개의 Dynamic 개체에있는 tab이 같은 주소를 가리키고 있습니다. 결과적으로 두 번 삭제시 삭제됩니다. 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; 
} 
+0

대단히 감사합니다! – Mat