C ++ Segfault иногда, но - PullRequest
       34

C ++ Segfault иногда, но

0 голосов
/ 24 октября 2018

Эта программа иногда дает мне segfault.Я хотел сравнить копию ctor с движением ctor по скорости.Что интересно, он никогда не генерирует segfault при работе в 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;
}

Сначала я хотел отсортировать векторы, но векторы дали мне segfault, когда я использовал слишком много элементов (десятки тысяч) даже при установке исходногоразмер.Так что я просто написал это.В чем проблема?

1 Ответ

0 голосов
/ 24 октября 2018

Проблема в строках ниже в конструкторе копирования 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);

Вы можете прочитать о правиле трех и рассмотреть возможность использования деструктора virtualв базовом классе.

...