两个关于类的创建的问题
2011-05-08 12:13
155 查看
<一>、使一个对象可以在堆上创建,但是不能在栈上创建
步骤一:使类的所有构造函数私有化
Class A
{
Private:
A(){}
};
Int main()
{
A a;//在栈上创建对象,会出现编译错误
}
这时,已经实现了禁止对象在栈上的创建,但是同时也禁止了对象的实例化,也就是说类A也不能在堆上创建,为了实现能够在堆上创建A类的对象,请进行第二步操作。
步骤二:
Class A
{
Public:
Static A* newInstance()
{
Return new A;
}
Private:
A(){}
};
Int main()
{
A a;//在栈上创建对象,会出现编译错误
A* a = A::newInstance();//成功在堆上创建对象
}
这时出现了内存泄漏,因为在堆上分配的内存无法释放掉,为了实现内存的释放,请进行第三步操作。
步骤三:
Class A
{
Public:
Static A* newInstance()
{
Return new A;
}
Static void deleteInstance(A* a)
{
If (a != NULL)
{
Delete a;
}
}
Private:
A(){}
};
Int main()
{
A a;//在栈上创建对象,会出现编译错误
A* a = A::newInstance();//成功在堆上创建对象
A::deleteInstance(a);//成功释放内存
}
<二>、使一个对象可以在栈上创建,但是不能在堆上创建
方法是通过重载new和delete操作符并且私有化,这样就可以禁止对象在堆上分配了(因为一个对象在堆上的创建只能通过new来实现)
Class A
{
Private:
Void* operator new (size_t size)
{
Return malloc(size);
}
Void operator delete(void* ptr)
{
If (ptr)
Free(ptr);
}
Public:
A(){}
}
Int main()
{
A a;//在栈上创建,正确
A* a = new A;//在堆上创建,编译错误
}
步骤一:使类的所有构造函数私有化
Class A
{
Private:
A(){}
};
Int main()
{
A a;//在栈上创建对象,会出现编译错误
}
这时,已经实现了禁止对象在栈上的创建,但是同时也禁止了对象的实例化,也就是说类A也不能在堆上创建,为了实现能够在堆上创建A类的对象,请进行第二步操作。
步骤二:
Class A
{
Public:
Static A* newInstance()
{
Return new A;
}
Private:
A(){}
};
Int main()
{
A a;//在栈上创建对象,会出现编译错误
A* a = A::newInstance();//成功在堆上创建对象
}
这时出现了内存泄漏,因为在堆上分配的内存无法释放掉,为了实现内存的释放,请进行第三步操作。
步骤三:
Class A
{
Public:
Static A* newInstance()
{
Return new A;
}
Static void deleteInstance(A* a)
{
If (a != NULL)
{
Delete a;
}
}
Private:
A(){}
};
Int main()
{
A a;//在栈上创建对象,会出现编译错误
A* a = A::newInstance();//成功在堆上创建对象
A::deleteInstance(a);//成功释放内存
}
<二>、使一个对象可以在栈上创建,但是不能在堆上创建
方法是通过重载new和delete操作符并且私有化,这样就可以禁止对象在堆上分配了(因为一个对象在堆上的创建只能通过new来实现)
Class A
{
Private:
Void* operator new (size_t size)
{
Return malloc(size);
}
Void operator delete(void* ptr)
{
If (ptr)
Free(ptr);
}
Public:
A(){}
}
Int main()
{
A a;//在栈上创建,正确
A* a = new A;//在堆上创建,编译错误
}
相关文章推荐
- 关于android创建快捷方式会启动两个应用的问题(一)
- 关于android创建快捷方式会启动两个应用的问题(二)
- 关于android创建快捷方式会启动两个应用的问题(一)
- 关于android创建快捷方式会启动两个应用的问题
- 关于android创建快捷方式会启动两个应用的问题
- 关于创建一个输入端和两个输出端遇到问题的解决
- VS2013关于库的两个问题
- 关于创建MFC项目发生当前页面脚本发生错误(691)的问题解决
- 关于“设计4个线程,其中两个线程对j加1,另外两个线程对j减1”的问题
- 【同一个Server Weblogic两个Domain CookieName冲突导致session失效问题】【关于WebLogic的Session丢失的问题】
- 关于矩阵数字的两个有趣问题
- 关于DIV中display属性误区以及牵扯出来的两个问题
- 关于mysql外键创建失败的问题
- 关于两个路由器互连的问题
- 关于脚本语言PERL的两个笔记(编码问题,未完全解决)
- 关于新版ADT创建项目时出现appcompat_v7的问题
- 关于oracle创建定时器和定时器创建成功后不运行的问题解决
- 关于用两个栈实现一个队列的小问题
- 关于两个栈的共享空间问题理解。
- 关于在创建文件时需要注意的问题