该程序有时会给我段错误。 我想比较复制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;
}
起初我想对向量进行排序,但是当我使用太多元素(成千上万个)时,即使设置了初始大小,向量也会给我带来段错误。 所以我只是写了这个。有什么问题吗?
答案 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
析构函数。