C++有时会出现段错误

0 c++ segmentation-fault c++11

这个程序有时给我分段错误.我想比较复制ctor和move 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;
}
Run Code Online (Sandbox Code Playgroud)

起初我想对矢量进行排序,但是当我使用太多元素时,矢量给了我segfault.(成千上万)甚至设置了初始大小.所以我写了这个.问题是什么?

raf*_*x07 6

问题出在复制构造函数的下面几行 Alma

v= (int*) malloc(size * sizeof(int));
size=a.size;
Run Code Online (Sandbox Code Playgroud)

malloc什么时候你的价值是size什么?它是不确定的,因此这个调用会导致未定义的行为.size=a.size应该首先被称为.

size=a.size;
v= (int*) malloc(size * sizeof(int));
Run Code Online (Sandbox Code Playgroud)

第二个问题,你通过mallocC函数分配内存,但为什么要删除delete?它不一致,当你使用malloc时应该调用free删除内存.

free(v);
Run Code Online (Sandbox Code Playgroud)

您可以阅读有关三的规则并考虑virtual在基类中使用析构函数.