在给类函数赋值时遇到问题。 我正在尝试使用dqr构造函数分配值,但这些值未传递到dqr类的构建成员函数。 它显示的错误是细分错误。
class dqr{
int block_size;
int *blocks;
public:
dqr(int input[], int);
void build(int input[], int n);
void update(int input[],int,int , int);
};
dqr::dqr(int input[], int n){
int block_size=(sqrt(n));
cout<<"block Size :"<<block_size;
int *blocks=new int[block_size];
}
void dqr::build(int input[], int n ){
for(int i=0;i<(n-1);i++){
blocks[i/block_size]+=input[i];}
for(int i=0;i<block_size;i++){
cout<<blocks[i];
} }
int main()
{
int input[] = {1, 5, 2, 4, 6, 1, 3, 5, 7, 10};
int n = sizeof(input)/sizeof(input[0]);
dqr d(input, n);
d.build(input,n);
return 0;
}
答案 0 :(得分:1)
您的代码的主要问题是构造函数中的这一行:
int *blocks=new int[block_size];
指针int *blocks
与成员指针int *blocks
不同。发生的情况是,您在构造函数中创建了一个名为blocks
的本地指针,该指针在离开构造函数的作用域后即消失。不幸的是,您已经在本地指针指向的堆中分配了内存。但是,当本地指针死掉并且有泄漏时,不会释放该内存。
您在int block_size
上遇到了同样的问题,您也将其重新创建为构造函数中的局部变量。
您的构造函数应如下所示:
dqr(int input[], int n)
{
block_size = sqrt(n); //using the member variable block_size.
std::cout<< "block Size :" << block_size <<std::endl;
blocks = new int[block_size]; //using the member pointer blocks.
}
我仍然不确定为什么将n
的平方根作为新的块大小,但是我想那是您设计的一部分。
也不要忘记清除析构函数中的内存。事实上,这就是为什么我们使用智能指针。对于您而言,unique_ptr是最佳选择。
答案 1 :(得分:0)
分段错误的原因在下面的代码中。
dqr::dqr(int input[], int n){
int block_size=(sqrt(n));
cout<<"block Size :"<<block_size;
int *blocks=new int[block_size];
}
blocks变量声明为局部变量。因此,在构建函数的blocks变量中,未在堆内存中分配(动态分配)。
答案 2 :(得分:0)
由于您使用的是C ++的GCC编译器,因此当您有一个声明的局部变量遮盖了类变量时,有一个编译器选项会向您发出警告。是-Wshadow
。
使用此选项进行编译会给您以下警告:
warning: declaration of 'block_size' shadows a member of 'dqr' [-Wshadow]
int block_size=(sqrt(n));
^~~~~~~~~~
<source>:7:9: note: shadowed declaration is here
int block_size;
^~~~~~~~~~
<source>:19:15: warning: declaration of 'blocks' shadows a member of 'dqr' [-Wshadow]
int* blocks=new int[block_size];
^~~~~~
<source>:8:10: note: shadowed declaration is here
int *blocks;
^~~~~~
请参见 Demo 。
从以上警告中,您将知道必须替换以上两行并以以下方式实际初始化类变量:
block_size = (sqrt(n));
blocks = new int[block_size];