一个关于 try catch 的问题, 工作中遇到的。 十分不解

飞哥 2018-05-25 09:14:43
先上代码 写了个例子程序

#include "stdafx.h"
#include <iostream>
using namespace std;

class A
{
public:
A(){cout<<"创建";};
~A(){cout<<"析构";}
};

bool Test1(A ppp)
{
try
{
int a = 10;
int b = 20;
//return false;
}
catch(...)
{
return false;
}
}
int _tmain(int argc, _TCHAR* argv[])
{
A *p1 = new A; ;
Test1(*p1);
return 0;
}



事情是这样的,最近单位的程序发现有内存泄露,最后定位到 某个对象的引用计数 没有归0. 所以没析构。

经过各种调查,发现我们有一个函数里面有try catch ,但是在try 中 没有returen, 而return写在了catch中。

发现问题后,写了上面的例子

现在例子直接运行,执行完 test1 函数后,类A的析构函数是不执行的,除非把try里的return打开,才会进行析构


请大神帮忙解释下,这是为什么???
...全文
1410 38 打赏 收藏 转发到动态 举报
写回复
用AI写文章
38 条回复
切换为时间正序
请发表友善的回复…
发表回复
zilaishuichina 2018-05-28
  • 打赏
  • 举报
回复
编译器bug, vs2015,实测也没有lz的这种问题
宁南学者 2018-05-28
  • 打赏
  • 举报
回复
应该和编译环境有关,我在ubuntu上面,g++ 5.4.0,没有发现有这个问题,形参拷贝构造的,自己析构了。
飞哥 2018-05-28
  • 打赏
  • 举报
回复
引用 28 楼 weixin_42214749 的回复:
16楼说的对,你在main里new的对象,然后使用传对象的方式(只是临时对象)给其他函数,原来你new的对象并没有释放,和try没有关系。
小伙子 我建议你多看书。 new和delete成对这种事 还需要拿到这上说吗? 现在研究的是,为什么形参在try里没有return的情况下,不析构。 并不是讽刺,而是希望你看到真正重要的问题 而不是 那种书本上最最最基础的问题
从来不用 2018-05-28
  • 打赏
  • 举报
回复
你把整个try catch去掉,你 还是有内存泄漏,干嘛不正确面对自己
从来不用 2018-05-28
  • 打赏
  • 举报
回复
真可悲啊,很明显的内存泄漏,跟try有什么关系,犯低级错误非要说诡异的错误!
从来不用 2018-05-28
  • 打赏
  • 举报
回复
引用 33 楼 wanfustudio 的回复:
[quote=引用 28 楼 weixin_42214749 的回复:] 16楼说的对,你在main里new的对象,然后使用传对象的方式(只是临时对象)给其他函数,原来你new的对象并没有释放,和try没有关系。
小伙子 我建议你多看书。 new和delete成对这种事 还需要拿到这上说吗? 现在研究的是,为什么形参在try里没有return的情况下,不析构。 并不是讽刺,而是希望你看到真正重要的问题 而不是 那种书本上最最最基础的问题[/quote] 你在main里加上delete ,不管你try里是否return都不会有你的问题了,我的意思这样的,编译器的行为
yshuise 2018-05-26
  • 打赏
  • 举报
回复
而且你的代码根本就不会抛出异常,楼主逗我们。
yshuise 2018-05-26
  • 打赏
  • 举报
回复
不是return,而是throw
走好每一步 2018-05-26
  • 打赏
  • 举报
回复
c++11已经有智能指针了,boost说实话,不大喜欢那玩意。
地球太平洋 2018-05-25
  • 打赏
  • 举报
回复
return 语句和栈是相关的,如果没有return语句,栈相关的清理工作没有完成,所以对象也不可能机构。
donjin9 2018-05-25
  • 打赏
  • 举报
回复
这相当于漏写了return语句。返回前的形参析构执行代码也不会生成。不知道为什么。
飞哥 2018-05-25
  • 打赏
  • 举报
回复
引用 10 楼 rongrong0538 的回复:
除非用shared_ptr<A> p1 = make_shared<A>();才有引用计数
形参到函数结束应该会析构 比如我在try里 加一行return true; test函数执行完 就会析构。
鑫森淼焱垚 2018-05-25
  • 打赏
  • 举报
回复
除非用shared_ptr<A> p1 = make_shared<A>();才有引用计数
鑫森淼焱垚 2018-05-25
  • 打赏
  • 举报
回复
有new,没找到delete啊
Saleayas 2018-05-25
  • 打赏
  • 举报
回复
怎么可能呢,先不说编译器的警告。 就算忽略了,也会执行拷贝构造和析构的, 没有第二次析构是因为 new 没有 delete.
飞哥 2018-05-25
  • 打赏
  • 举报
回复
引用 5 楼 wanfustudio 的回复:
[quote=引用 2 楼 wanfustudio 的回复:] [quote=引用 1 楼 adlay 的回复:] 不调用析构函数的时候调用了构造函数吗? 如果对应着都没调用那就是编译器做了优化, 把没用到的对象省了吧.构造和析构不对应了才是有问题了
调用函数时候应该是拷贝构造。但是没写拷贝构造的实现。 [/quote] 在调用函数的时候,是调用了拷贝构造的。刚才实现了[/quote] 在调用函数的时候,调用完拷贝构造 才开始执行函数内的代码
飞哥 2018-05-25
  • 打赏
  • 举报
回复
引用 5 楼 wanfustudio 的回复:
[quote=引用 2 楼 wanfustudio 的回复:] [quote=引用 1 楼 adlay 的回复:] 不调用析构函数的时候调用了构造函数吗? 如果对应着都没调用那就是编译器做了优化, 把没用到的对象省了吧.构造和析构不对应了才是有问题了
调用函数时候应该是拷贝构造。但是没写拷贝构造的实现。 [/quote] 在调用函数的时候,是调用了拷贝构造的。刚才实现了[/quote] 在调用函数的时候,是调用了拷贝构造的。刚才实现了
www_adintr_com 2018-05-25
  • 打赏
  • 举报
回复
引用 5 楼 wanfustudio 的回复:
[quote=引用 2 楼 wanfustudio 的回复:] [quote=引用 1 楼 adlay 的回复:] 不调用析构函数的时候调用了构造函数吗? 如果对应着都没调用那就是编译器做了优化, 把没用到的对象省了吧.构造和析构不对应了才是有问题了
调用函数时候应该是拷贝构造。但是没写拷贝构造的实现。 [/quote] 在调用函数的时候,是调用了拷贝构造的。刚才实现了[/quote] 是在进入 Test1 函数之前调用的还是之后?
飞哥 2018-05-25
  • 打赏
  • 举报
回复
引用 2 楼 wanfustudio 的回复:
[quote=引用 1 楼 adlay 的回复:] 不调用析构函数的时候调用了构造函数吗? 如果对应着都没调用那就是编译器做了优化, 把没用到的对象省了吧.构造和析构不对应了才是有问题了
调用函数时候应该是拷贝构造。但是没写拷贝构造的实现。 [/quote] 我不理解的是 为什么在try 里面 有return,就会析构,而try里面没有returne就不会析构。
www_adintr_com 2018-05-25
  • 打赏
  • 举报
回复
引用 2 楼 wanfustudio 的回复:
[quote=引用 1 楼 adlay 的回复:] 不调用析构函数的时候调用了构造函数吗? 如果对应着都没调用那就是编译器做了优化, 把没用到的对象省了吧.构造和析构不对应了才是有问题了
调用函数时候应该是拷贝构造。但是没写拷贝构造的实现。 [/quote] 那就实现一个来看呗
加载更多回复(18)

64,646

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧