C ++ segfault有时但

时间:2018-10-24 17:20:21

标签: c++ c++11 segmentation-fault

该程序有时会给我段错误。  我想比较复制ctor和移动ctor的速度。 有趣的是,它在gdb中运行时永远不会抛出段错误。

#include <iostream>
 #include <cstdlib>
 #include <ctime>
using namespace std;

 class Alma{
     protected:
        int* v;
        int size;
     public:
        void p_r(void);
        void fill_r(void);
        Alma(int size){
            this->size=size;
            v= (int*) malloc(size * sizeof(int));
        }
        ~Alma(){
            delete v ;
        } 
        Alma(const Alma& a){
            clock_t begin = clock();
            v= (int*) malloc(size * sizeof(int));
            size=a.size;
            for(int i =0; i< size;i++ ){
                 v[i]=a.v[i];
            }
            clock_t end = clock();
            double ms = double(end - begin) / CLOCKS_PER_SEC;
            cout << "copy / time:"<< ms << endl;
        }
};
class Korte:public Alma{
    public:
        Korte(int size):Alma(size){}

    Korte& operator=(Korte&& a){
            clock_t begin = clock();
             v=a.v;
             size=a.size;
             a.size=0;
             a.v=nullptr;
             clock_t end = clock();
             double ms = double(end - begin) / CLOCKS_PER_SEC;
             cout << "move / time:"<< ms << endl;
            return *this;
         }
};
void Alma::fill_r(){
    for(int i =0; i< size;i++ ){    
        v[i]=rand();
    }
}
int main(){
    Alma a(20000000);
    a.fill_r();
    Alma b = a;
    Korte k(20000000);
    k.fill_r();
    Korte k2(2);
    k2=move(k);
    return 0;
}

起初我想对向量进行排序,但是当我使用太多元素(成千上万个)时,即使设置了初始大小,向量也会给我带来段错误。 所以我只是写了这个。有什么问题吗?

1 个答案:

答案 0 :(得分:6)

问题出在Alma的副本构造函数的以下几行中

v= (int*) malloc(size * sizeof(int));
size=a.size;

调用malloc时,size的值是什么?它是不确定的,因此此调用导致不确定的行为。 size=a.size应该首先被调用。

size=a.size;
v= (int*) malloc(size * sizeof(int));

第二个问题,您通过malloc C函数分配内存,但是为什么要通过delete删除内存?不一致,使用malloc时应调用free删除内存。

free(v);

您可能会了解rule of three,并考虑在基类中使用virtual析构函数。