作者:finallyly 出处:博客园(注意:转载请注明作者和出处)
最近打算写一个算法类,算法类中要有一个指针型数据成员,然而该指针型数据成员却不能在构造函数只能够分配堆内存(因为此时我们还不确定数组的维度),只有调用了某个函数之后,方知道动态数组维度,考虑不在类的构造函数中调用确定数组维度的那个函数做如下设想:
在类的其他其他成员函数中为该指针成员分配堆内存,析构函数中释放该数据成员。问了几个同学和网友后做如下设计:

class stringprocess
{
public:
stringprocess(void);
~stringprocess(void);
//int GetLongestCommonSequence(wstring x,wstring y,wstring result);
void test();
private:
int *indexes;//声明指向指针的指针,保存两个字符串中的最长公共序列中的字符分别出现的位置。
wstring xpart;//最大公共字序列的父串之一
wstring ypart;//
};
该类的构造函数
{
public:
stringprocess(void);
~stringprocess(void);
//int GetLongestCommonSequence(wstring x,wstring y,wstring result);
void test();
private:
int *indexes;//声明指向指针的指针,保存两个字符串中的最长公共序列中的字符分别出现的位置。
wstring xpart;//最大公共字序列的父串之一
wstring ypart;//
};

stringprocess::stringprocess(void)
{
indexes=NULL;
}
{
indexes=NULL;
}
该类的析构函数
:
stringprocess::~stringprocess(void)
{
if (indexes!=NULL)
{
cout<<"指针成员变量已经被分配了堆内存,需要以delete模式释放"<<endl;
delete[] indexes;
cout<<"释放完毕"<<endl;
}
else
{
cout<<"指针成员变量为被分配堆内存,不需要以delete模式释放"<<endl;
}
cout<<"destructor"<<endl;
}
{
if (indexes!=NULL)
{
cout<<"指针成员变量已经被分配了堆内存,需要以delete模式释放"<<endl;
delete[] indexes;
cout<<"释放完毕"<<endl;
}
else
{
cout<<"指针成员变量为被分配堆内存,不需要以delete模式释放"<<endl;
}
cout<<"destructor"<<endl;
}
该类中为指针数据成员分配堆内存的成员函数

void stringprocess::test()
{
indexes=new int[5];
}
{
indexes=new int[5];
}
主函数中测试调用:
int _tmain(int argc, _TCHAR* argv[])
{
stringprocess p;
p.test();
cout<<"finish"<<endl;
int f;
cin>>f;
}
{
stringprocess p;
p.test();
cout<<"finish"<<endl;
int f;
cin>>f;
}
输出结果:
如果主函数中不调用p的test函数则运行结果如下:
鉴于一般的C++入门课本仅提到“在构造函数中动态分配堆内存,在析构函数中释放”,以上内容仅供C++初学者参考之,避免造成思维固化。