C++ std :: sort不适用于指向vector的指针

Joh*_*hnC 1 c++ sorting vector

经过多次搜索,似乎指向向量的指针不是最好的事情.但是,以下代码对我造成了太多错误:

  1 #include <stdio.h>
  2 #include <algorithm>
  3 #include <vector>
  4
  5
  6 class Hdr
  7 {
  8     public:
  9     std::vector<long> *order;
 10     bool operator()(long i1, long i2) const;
 11     Hdr(int N);
 12     ~Hdr();
 13 };
 14
 15 Hdr::Hdr(int N)
 16 {
 17     order = new std::vector<long>(N,0);
 18     for(int k=0;k<N;k++) (*order)[k] = -k;
 19 };
 20
 21 Hdr::~Hdr()
 22 {
 23     order->clear();
 24     delete order;
 25 };
 26
 27 bool Hdr::operator()(long i1, long i2) const
 28 {
 29     return (i1<i2);
 30 };
 31
 32 int main(void)
 33 {
 34     Hdr mhdr(1000);
 35     std::sort(mhdr.order->begin(),mhdr.order->end(),mhdr);
 36
 37     printf("value at 300 = %d\n",mhdr.order->at(300));
 38 };
Run Code Online (Sandbox Code Playgroud)

在Linux上使用gcc 4.3,可执行文件提供"双重免费或损坏".所以我注释了第24行,它抛出'std :: out_of_range'.显然,当动态分配的向量传递给std :: sort时,第35行(sort)会混淆一切.或者我在某个地方遇到了一个大错.请帮忙!!如果我将第9行更改为std :: vector order,那么事情似乎很好; 但是我不禁想知道向量指针出了什么问题.

Jam*_*lis 12

您没有遵循规则三:您没有为您的类定义复制构造函数和复制赋值运算符.

mhdr当你把它作为仿函数传递给你时,你会复制一份std::sort.该order副本和原始数据的数据成员mhdr都指向同一个对象.副本被销毁,导致其指向的对象order被删除,然后原始文件在main结束时被销毁,导致双重删除,未定义的行为以及其他有趣的事情发生.

(事实上​​,可能会在内部制作更多副本std::sort,因此它甚至可能会更早崩溃.)

你为什么动态分配std::vector?如果有任何充分的理由这样做,那么它们很少.


Phi*_*ler 5

你将mhdr值传递给std::sort(),使用一个默认的复制构造函数复制指向你的向量的指针,并delete在该实例超出范围时使用它.那不是你想要的.

您可能应该使用与持有该向量的东西不同的比较器对象,或者引用计数指向向量的指针(可能使用适当的智能指针类).