#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;
}
然后,您完全不必担心在尝试使用对象的组件之前是否调用了成员函数。