无法使用构造函数将值分配给类函数

时间:2019-03-25 09:26:26

标签: c++

在给类函数赋值时遇到问题。 我正在尝试使用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; 
    }

3 个答案:

答案 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是最佳选择。

示例代码:https://rextester.com/CGFQQ92378

答案 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];