在该类的成员函数中实例化一个类是否安全?例如,假设我有成员函数CMyClass
的类CMyClass::MemberFunc
,我想在CMyClass
内创建另一个CMyClass::MemberFunc
实例。
void CMyClass::MemberFunc( void )
{
CMyClass * pMyClass = new CMyClass();
}
这合法/安全吗?我知道它编译。我关心的是递归。当我第一次从主应用程序实例化CMyClass
时,是否会遇到递归错误?
void main( void )
{
static CMyClass * s_pMyClass = new CMyClass(); // Will this cause recursion?
}
或者,只有在调用具有附加类实例的特定成员函数时才会发生递归吗?
void CMyClass::MemberFunc( void )
{
CMyClass * pMyClass = new CMyClass();
pMyClass->MemberFunc(); // Pretty sure this will cause a recursive loop.
}
换句话说,我可以安全地在该类的成员函数中实例化一个给定的类,只要我不调用该类的第二个实例的成员函数吗?感谢。
答案 0 :(得分:3)
这比实例化任何其他对象更安全或更不安全。请注意,在底部的示例中,递归严格基于方法调用自身的事实;无论如何,它都会无限期地递归。
总之:你应该没事。
答案 1 :(得分:2)
调用自身的(成员)函数称为递归。
这合法/安全吗?
void CMyClass::MemberFunc( void )
{
CMyClass * pMyClass = new CMyClass();
delete pMyClass ; // newly added.
}
部分正确。因为每个new
操作都应该具有delete
操作,并伴随特定实例将资源返回到免费存储。除了内存泄漏之外,上面的代码段也没问题。
或者,只有在调用具有附加类实例的特定成员函数时才会发生递归吗?
void CMyClass::MemberFunc( void )
{
CMyClass * pMyClass = new CMyClass();
pMyClass->MemberFunc(); // Pretty sure this will cause a recursive loop.
}
是的,经过一段时间后,由于没有办法为特定实例调用析构函数,因为CMyClass::MemberFunc
被递归调用,所以你应该用完内存。(假设delete pMyClass;
为结束语句在成员函数中)
此外,当方法没有收到任何参数时,不需要在参数列表中放置void
。我认为,它是C
风格。
答案 2 :(得分:1)
更正,除非您从创建的第二个实例中显式调用该成员函数,否则不会导致递归。当然,只要你有某种基本情况可以突破,递归并不总是坏事。
答案 3 :(得分:0)
不,它不会导致递归 - 如果确实如此,您的编译器会将其标记为错误。我怀疑你真的想要创建一个类的静态实例(例如一个单例)。你能发一个真实世界的用例来说明你想做什么吗?