24小时热门版块排行榜    

查看: 2309  |  回复: 6
当前只显示满足指定条件的回帖,点击这里查看本话题的所有回帖

朱biyun

铜虫 (小有名气)

[求助] VC++中函数返回数组指针或者带指针的结构体的编译方式是否可取?

偶以前经常采用这种方式来进行C++的编程,只是在用delete释放内存时需要小心一些。
用这种方式编程的一个好处在于,比如计算矩阵运算,例如A+B时,可采用运算符+的重载来进行,这样在使用程序包时会很方便。
可最近喜欢在结构体中的使用析构函数,发现有个问题,就是子函数返回结构体时,会自动执行析构函数(即使当此结构体为外部变量时依然如此),因此把结构体中的指针内存提早释放,导致返回的结构体中的指针也相应被释放,最终出错。

我看书中的程序范例在计算矩阵或者多项式时,都不是采用运算符重载,而是用常规的函数,把所用用到的结构体都用加&的方式赋过来,才不会被析构函数释放,可这种操作显然太麻烦?但不知道是不是以前我的编程方式,本身就是一种错误的习惯,还是说干脆放弃使用析构函数,每次手动释放内存?可是有没有更好的方式可以二者兼得呢?
回复此楼
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

神气活现

铁虫 (初入文坛)

既然是c++,这种做法没有必要。晦涩且容易出错。
smartpoint 就是为了解决这些问题的,楼主不妨看看。

我个人的做法是,自定义一个类用来管理自身,然后派生之。
比楼上多一个内存管理。这样易于优化。
7楼2013-08-16 19:50:27
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
查看全部 7 个回答

libralibra

至尊木虫 (著名写手)

骠骑将军

【答案】应助回帖

感谢参与,应助指数 +1
构造函数+析构函数应该是比较正规的做法吧,
你的结构体/类被提早释放的问题,是不是那个结构体是局部变量,当超出作用域时对象被销毁,如果存在析构函数,会被默认调用,
如果你返回结构体/类的指针,按理不会被自动析构的
你最好贴一段出问题的代码来看看
matlab/VB/python/c++/Java写程序请发QQ邮件:790404545@qq.com
2楼2012-07-07 18:58:14
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

nebulaly

木虫 (著名写手)

【答案】应助回帖

★ ★
感谢参与,应助指数 +1
朱biyun: 金币+2, 有帮助, 内容好多~~ 2012-07-20 15:58:15
请看Scott Meyers《50法》中的相关章节
3楼2012-07-08 01:54:06
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

朱biyun

铜虫 (小有名气)

引用回帖:
2楼: Originally posted by libralibra at 2012-07-07 18:58:14
构造函数+析构函数应该是比较正规的做法吧,
你的结构体/类被提早释放的问题,是不是那个结构体是局部变量,当超出作用域时对象被销毁,如果存在析构函数,会被默认调用,
如果你返回结构体/类的指针,按理不会被自动析构 ...

matrix operator+(matrix& A)  //矩阵加法
  {
    int i,j;
        ANSm.build(m,n);
        if(n!=A.n||m!=A.m)
        {
          printf("\nERROR!!!\n行列不对应的两个矩阵不能相加。";
          return ANSm;
        }
        for(i=0;i           for(j=0;j             ANSm.M[j]=M[j]+A.M[j];
        return ANSm;
  }

这是定义在结构体matrix中的一个成员,用于计算矩阵加法,其中m,n分别表示矩阵的行与列,二重指针M对应矩阵的二维数组,对象ANSm是在外部定义的,在返回ANSm后,它就自动执行了ANSm中的析构函数,因此把返回结构体中的指针也释放了。

目前偶的一个办法就是在结构体中增加一个判定变量,使得析构函数在主函数main结束前,不能释放ANSm中的指针。
4楼2012-07-08 09:39:47
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
最具人气热帖推荐 [查看全部] 作者 回/看 最后发表
[基金申请] 2026国自然函评费到账 +7 羊腰板 2026-08-21 7/350 2026-08-21 21:28 by iwuli
[基金申请] 科研孤儿太难了 +17 我4大白菜 2026-08-20 18/900 2026-08-21 20:57 by zhangev
[基金申请] 看来今天不会放榜了? +8 chengyan1220 2026-08-21 11/550 2026-08-21 17:52 by dcqxinyang
[基金申请] 时间戳又变了 +13 wuchongjun 2026-08-20 19/950 2026-08-21 17:21 by 紫杉醇
[基金申请] filecode,4个jtjc了 +11 ziyangfang 2026-08-19 14/700 2026-08-21 16:51 by applepetty
[基金申请] 人气不行了 +7 fansofjerry 2026-08-21 7/350 2026-08-21 14:13 by Vivilian
[基金申请] 感觉是下周放榜了 +7 angus9576 2026-08-17 12/600 2026-08-21 13:38 by weiyin
[基金申请] 我面上完蛋了 +7 且听虎啸 2026-08-20 8/400 2026-08-21 12:31 by 酷酷墨镜
[基金申请] 只有每年这种时候来逛逛小木虫 +23 yaoyewhu2008 2026-08-20 25/1250 2026-08-21 12:19 by Poppy1104
[基金申请] 时间戳又变了8-15 +15 archvillain 2026-08-15 27/1350 2026-08-21 11:32 by tim76
[基金申请] 应该是下周三26日公布了吧? +4 哈哈蛤? 2026-08-21 4/200 2026-08-21 10:58 by Vivilian
[论文投稿] 投稿咨询 +5 wwm09 2026-08-17 7/350 2026-08-21 10:11 by 期刊论文帮手
[基金申请] 基金啊基金 +4 longfie172 2026-08-20 4/200 2026-08-21 08:58 by mark mao
[基金申请] 今天系统多次维护,明天很可能放榜! +10 zju2000 2026-08-16 11/550 2026-08-20 20:02 by cl479861084
[基金申请] 时间戳变了,能看出什么问题? +18 基诺咪客 2026-08-17 23/1150 2026-08-20 17:19 by Godzela
[教师之家] 为什么余额宝的年化利率越来越低?主要原因有哪些? +5 瞬息宇宙 2026-08-15 5/250 2026-08-19 20:23 by super2002521
[基金申请] 2027广东省杰青 +4 奶牛小黑 2026-08-15 10/500 2026-08-19 11:02 by wanfengnew
[基金申请] 朋友圈看到的 +6 wangzilk 2026-08-18 8/400 2026-08-19 10:55 by Haru815
[基金申请] 明天放榜? +5 Shxjjxjkx 2026-08-18 5/250 2026-08-18 18:14 by -大大大大大-
[基金申请] 今天维护系统维护 祝所有人 高中 +8 gjjjzhong 2026-08-18 9/450 2026-08-18 13:01 by 家与远方
信息提示
请填处理意见