void Test(A* v)
{
return;
}这样好像容易一点.
{
return;
}这样好像容易一点.
解决方案 »
- GetFirstViewPosition();GetNextView(pos);的使用失败,急,在线等...... 遍历MDI 下的所有子窗口
- 关于vc开发ocx控件的问题
- 有关CTreeCtrl的插入项问题
- LNK2005问题 多个lib文件中函数重定义问题
- 我在基于位图的对话框上加了一个显示HTML的静态文本控件,可是在显示HTML的时候总有那个粗粗的边框,各们大虾,有没有办法把边框给灭了?
- 如何取得COMBO BOX 的索引?
- 我的程序用阻塞方式recv以后,调用closesocket会弹出一个错误框,怎样让他不弹出这个框而中断监听?
- 感谢chenhq(chenhq) 。近来接分
- MFC中对话框PreTranslateMessage消息拦截的问题
- 关于用VC实现注册表修改的问题!
- PeekMessage()用法?
- 图象是反的如何解决
这样做是没有问题的, 而且"A* Test()" 会在接口上更清晰一些, 但我想一定要返回引用.
A x;
该成:
static A x;
要好一点。但我是强烈建议你用第一种方法。第一种方法的要点是在调用Test函数的函数中不要忘记释放该对象。比如:
void myUsing()
{
A mA;
mA=Test();
//这里可以对A进行各种处理
delete &mA;//这一句很重要,释放空间,防止内存leak.
}
{
private:
int m_nCount;
};A &Test()
{
A *x = new A;
return *x;
}假设:
A &aa = Test();
在不需要 aa 时, delete &aa, 就这样呀, 有什么不行的, 呵呵, 不过难看了一点
其实你写
A &Test()
{
A *x = new A;
return *x;
}
编译器还是会把他处理成这样的函数
void test(A& __result)
{
A*x=new A;
__result=x;
}
有这样的写法吗? "delete &mA", mA本身就是在stack中, 为什么还要你去delete呢?
我试了一下你的写法, 确实没有内存泄露, 但请解释为什么要"delete &mA"?To liu_feng_fly:
不错, 编译器改写成这样, 但 "A *x = new A;" 一句中的"new"何时delete呢?
混乱: 如果我只有一个接口声明: A &Test(); 而不知道它是如何实现的(返回的东西是new出的还是一个static的对象), 我们就不知道是否应该"delete &a". 从而这种写法使程序的藕合度增大, 而根源就在于我们要返回一个对象的引用.
结论: 最好不要返回对象引用.
to Gallen:mA应该不是在stack中吧!它就是new出来的那个对象啊,应该是在heap中才是啊!
既然是这样的话,那个heap里面的对象肯定要delete才行啦!是不是?
delete &mA中的mA就是在Test()中A *x=new A中的那个x,你说那个x是在heap中还是在stack中的?参看darkay(火凤凰)的说法。
以下两段代码有什么区别?
CODE1:
A mA;
mA = Test();CODE2:
A &mA = Test();是否可以说: CODE1中的mA一定是在stack中, 而CODE2中的就不一定了, 要看Test()的实现?
原则上说,你说的很对。第一段代码通过生成一个中间变量的对象,然后把对象复制给mA,在删除中间对象,然后完成操作。
而第二段代码只能通过静态对象变量或者new新的对象变量返回,前者需要delete,后者是由编译器负责释放其空间。
delete &mA;
这种写法虽然正确,但很让人不理解. 谢谢