2014-12-16 1 views
-2

클래스 포인터 벡터를 정렬하는 함수를 작성하고 있습니다. 는 이러한 포함, 정렬 후std :: sort를 사용하여 포인터 벡터를 정렬하면 주소가 뒤죽박죽이됩니까?

{0x784170, 0x7841a0, 0x784050, 0x783f10, 0x783f40, 0x7832a0, 0x7832d0, 0x7831a0, 0x7831d0, 0x783080, 0x7830b0, 0x782f40, 0x782f70, 0x7827c0, 0x7827f0} 

: 정렬하기 전에 벡터는 다음 포인터를 포함

{0x3141954a38, 0x3141954a38, 0x784050, 0x783f10, 0x783f40, 0x7832a0, 0x7832d0, 0x7831a0, 0x7831d0, 0x783080, 0x7830b0, 0x782f40, 0x782f70, 0x7827c0, 0x80} 

는 IS 다음 내 코드 :

bool DNodeComparator(DNode* x, DNode* y) 
{ 
return x->getDFN() < y->getDFN(); 
} 

void sortFunction(){ 
    vector<DNode*> operations = ApplicationGraph.getOperations(); 
    std::sort(myvector.begin(), myvector.end(), mycomparator); 
} 

class DGraph 
{ 
    private: 
     vector<DNode*> Nodes; 

    public: 
     vector<DNode*> getOperations(){return Nodes;} 
}; 

코드는 종속성에서 실행 그래프는 DNode * 객체의 벡터를 포함합니다. 이 포인터 벡터를 반환하고 DFN 필드로 각 노드를 정렬합니다. DNode 클래스는 Operation * 객체, 일부 부울 플래그 및 종속성 그래프의 깊이 우선 번호 매기기를 계산하기위한 int 값을 포함합니다. 첫 번째 줄에 표시된 주소는 std::sort 호출 바로 전에 gdb print operations 호출의 결과입니다. 두 번째 줄의 주소는 std::sort 바로 뒤에 print operations 전화입니다.

몇 가지 디버깅 단계를 시도했지만 여전히이 오류를 조정할 수 없습니다. DNode *의 벡터를 반환하면 별도의 주소에 저장된이 벡터의 원하는 복사본이 만들어 지므로이 새로운 벡터를 수정하면 (예 : 더 많은 DNode 추가) 그래프 클래스의 실제 벡터가 수정되지 않습니다. 벡터에 여전히 각 DNode *가 포함되어 있어도 이로 인해 문제가 발생하지 않아야합니다.

+1

정확한 붙여 넣기는'{some pointers}'의 자리가 아닙니다. –

+8

코드에 문제가 있다고 생각하지만 여기에 표시된 코드는 아닙니다. –

+0

'{some pointers} '중 일부는 실제로 삭제 된 (로컬) 객체를 가리켜 저장소가 재사용되고 있다고 생각합니다. – molbdnilo

답변

1

다음은 비교자를 기반으로 한 작동 예제입니다. 코드이 다른 방법

0x80010308 2 0x80010318 1 0x80010328 3 0x800102f8 0 
0x800102f8 0 0x80010318 1 0x80010308 2 0x80010328 3 

OUPUT

#include <algorithm> 
#include <iostream> 
#include <vector> 

struct Obj { 
    int id; 
    int getID() { 
    return id; } 
    Obj(int i) : id(i) {} }; 

bool mycomparator(Obj* a, Obj* b) { 
    return a->getID() < b->getID(); } 

int main(int, char* []) { 
    std::vector<Obj*> myvector; 

    for (int i = 0; i < 4; ++i) { 
    myvector.push_back(new Obj(i)); } 

    std::random_shuffle(myvector.begin(), myvector.end()); 

    for (std::vector<Obj*>::iterator i = myvector.begin(); 
     i < myvector.end(); ++i) { 
    std::cout << (*i) << " " << (*i)->getID() << " "; } 

    std::cout << std::endl; 
    std::sort(myvector.begin(), myvector.end(), mycomparator); 

    for (std::vector<Obj*>::iterator i = myvector.begin(); 
     i < myvector.end(); ++i) { 
    std::cout << (*i) << " " << (*i)->getID() << " "; } 

    std::cout << std::endl; 
    return 0; } 

?

관련 문제