C++ 中的分段错误


#include<iostream>   
using namespace std; 
class Toto{  
private:  
   int w;   
public:  
    Toto();     //constructor   
    int *veg;     //pointer veg  
        void  func9()   
    {   
         veg =new int [4] ; //dynamic mem allocation     
    }   
        void func7()   
    {   
        delete [] veg;  //free mem    
    }      
};                                                                  
Toto::Toto() 
{   
    cout <<" contructor is here: " << endl;   
} 
int main () 
{ 
Toto pen;
cout << "enter numbers: ";  
for (int i=0;i<4;i++) 
{ 
    cin >> pen.veg[i];  
}
cout << endl;  
for (int i=0;i<4;i++) 
{ 
    cout << pen.veg[i] << " " << endl;  
}
return 0;
} 

由于某种原因,上面的代码产生了Seg错误。键入数字后,此代码会产生 seg 错误!请原谅乱码,只是初学者提前谢谢!

分配veg。在构造函数中分配它并在析构函数中删除它的最佳方法,如下所示:

class Toto{  
private:  
   int w;   
public:  
    int *veg;     //pointer veg 
    Toto() {
        veg =new int [4] ; //dynamic mem allocation
    };     //constructor   

    ~Toto() {   
        delete [] veg;  //free mem    
    };      
};       

或者您应该在使用veg之前致电func9()

如果你坚持动态分配,这样做是这样的:

class Toto {  
private:  
   int w;   
public:  
    Toto();     //constructor   
    ~Toto();    //destructor
    int * veg;     //pointer veg  
};
Toto::Toto() : veg(new int[4])
{   
    cout <<" contructor is here: " << endl;   
}
Toto::~Toto() {
    delete[] veg;
}

veg仅在尝试使用它之前调用func9()时才设置为有效值。如果你这样做,你可以尽情地玩弄veg[0] veg[3],只要你不打电话给func7()释放记忆。

所需成员变量的分配通常应该在构造函数中完成(在析构函数中解除分配),避免此类问题。

构造函数的主要优点之一是确保变量在参与任何对象使用之前正确且完全初始化。

一种方法是按以下方式修改代码:

#include<iostream>
using namespace std;
class Toto{
    private:
        int w;
    public:
        int *veg;
        Toto() { veg = new int[4]; }
        ~Toto() { delete[] veg; }
};
int main (void) {
    Toto pen;
    cout << "enter numbers: ";
    for (int i = 0; i < 4; i++)
        cin >> pen.veg[i];
    cout << endl;
    for (int i = 0; i < 4; i++)
        cout << pen.veg[i] << " " << endl;
    return 0;
}

然后,您完全不必担心在尝试使用对象的组件之前是否调用了成员函数。

相关内容

  • 没有找到相关文章

最新更新