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.(成千上万)甚至设置了初始大小.所以我写了这个.问题是什么?
问题出在复制构造函数的下面几行 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在基类中使用析构函数.
| 归档时间: |
|
| 查看次数: |
71 次 |
| 最近记录: |