这个程序有时会让我出错。我想比较一下复制器和移动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;
}
起初,我想对向量进行排序,但是当我使用太多的元素时,向量给了我分段错误。(数万)即使设置了初始大小。所以我就写了这个。有什么问题吗?
发布于 2018-10-24 17:27:32
问题在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
析构函数。
https://stackoverflow.com/questions/52974712
复制相似问题