使用std :: sort对指针矢量进行排序导致地址混乱?

时间:2014-12-16 12:19:01

标签: c++ sorting pointers vector

我正在编写一个函数来对类指针的向量进行排序。在排序之前,向量包含以下指针:

{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}

以下是我的代码:

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值。第一行中显示的地址是print operations调用之前的gdb std::sort调用的结果。第二行中的地址是print operations后的std::sort电话。

我已经尝试了几个调试步骤,但仍然无法协调此错误。返回DNode *的向量创建了该向量的所需副本,该副本存储在单独的地址中,因此修改此新向量(例如通过添加更多DNode)不会修改图类中的实际向量。这不应该导致任何问题,因为向量仍然包含每个DNode *。

1 个答案:

答案 0 :(得分:1)

以下是基于比较器的工作示例。

#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; }

输出

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

您的代码与此有何不同?