• 5083阅读
  • 9回复

被调函数中指针返回的问题!【扫盲贴---问题继续详见6L】~~~ [复制链接]

上一主题 下一主题
离线yangfanxing
 
只看楼主 倒序阅读 楼主  发表于: 2010-03-12
  1. #include <QApplication.h>
  2. #include <QtDebug>
  3. double* transpose()
  4. {
  5.     qDebug() <<"in it";
  6.     double trans[3][4] = {5,5,5,5,5,5,5,5,5,5,11,12};
  7.     double *ptBack = new double(12);
  8.     ptBack = &trans[0][0];
  9.     qDebug() << *(ptBack+0) << *(ptBack+1) << *(ptBack+2);
  10.     qDebug() << *(ptBack+3) << *(ptBack+4) << *(ptBack+5);
  11.     qDebug() << *(ptBack+6) << *(ptBack+7) << *(ptBack+8);
  12.     qDebug() << *(ptBack+9) << *(ptBack+10) << *(ptBack+11);
  13.     qDebug() << "No?" <<*(ptBack);
  14.     qDebug() << "No?" <<(ptBack);
  15.     qDebug() <<"out of it";
  16.     return ptBack;
  17. }
  18. int main(int argc, char *argv[])
  19. {
  20.     QApplication app(argc, argv);
  21.     double *ptReturn = transpose();
  22.     qDebug() << "Yes?" <<*(ptReturn);
  23.     qDebug() << "Yes?" <<(ptReturn);
  24. }


输出:
in it
5 5 5
5 5 5
5 5 5
5 11 12
No? 5
No? 0x22fde0
out of it
Yes? 3.47668e-310
Yes? 0x22fde0


我该如何取到被调函数ptBack指针返回的值?
No? 5
No? 0x22fde0 是被调函数中打印的东西;

Yes? 3.47668e-310
Yes? 0x22fde0 是主函数中打印的东西;
扫盲下~~~


【问题继续】在被调函数中做了指针空间的赋值:
  double trans[3][4] = {5,5,5,5,5,5,5,5,5,5,11,12};
    double *ptBack = new double(12);
    double *ptArray = &trans[0][0];
    for(int i = 0; i < 12; i++)
        *(ptBack+i) = *(ptArray+i);
然后在哪儿delete ptBack?main里边?
double *ptReturn = transpose();
delete ptReturn;

因为在被调函数中这个指针空间可能比较大,在哪儿free呢?
[ 此帖被yangfanxing在2010-03-12 11:29重新编辑 ]
PHPWind好恶心。。。不想看这种界面。。。
离线xinqingfly

只看该作者 1楼 发表于: 2010-03-12
ptBack = &trans[0][0];后ptBack原来指向的内存就泄漏了,前面不需要new,另外你返回的是局部变量的地址,返回后该指针指向的地址已经无效了,所以qDebug() << "Yes?" <<*(ptReturn);输出是个野指针的值,除非static double trans[3][4] = {5,5,5,5,5,5,5,5,5,5,11,12};或者new完ptBack后*ptBack=这样赋值给它,不过这样只能返回一个值
大概是这样吧
菜鸟也是鸟
离线benbenmajia

只看该作者 2楼 发表于: 2010-03-12
汗,你return的是指针,指针指向的值去不出来?就是 *pBack
安然.....
离线love0105

只看该作者 3楼 发表于: 2010-03-12
double trans[3][4] = {5,5,5,5,5,5,5,5,5,5,11,12};
    double *ptBack = new double(12);
    ptBack = &trans[0][0];

这段代码有问题,trans是局部变量,函数体执行结束后,已经被释放掉。虽然ptBack 是new出来的,但是new出来的空间,并没有负任何值,虽然指向了trans,但函数体结束后,它指向的内容已经被释放。想要达到目的的话,将数组的内容复制到new出的空间里
离线benbenmajia

只看该作者 4楼 发表于: 2010-03-12
原来小羊羊你问这个问题啊,我囧,哈哈
安然.....
离线yangfanxing
只看该作者 5楼 发表于: 2010-03-12
引用第4楼benbenmajia于2010-03-12 10:45发表的  :
原来小羊羊你问这个问题啊,我囧,哈哈


不要囧啦,,,哎。。。
PHPWind好恶心。。。不想看这种界面。。。
离线yangfanxing
只看该作者 6楼 发表于: 2010-03-12
引用第3楼love0105于2010-03-12 10:17发表的  :
double trans[3][4] = {5,5,5,5,5,5,5,5,5,5,11,12};
    double *ptBack = new double(12);
    ptBack = &trans[0][0];
这段代码有问题,trans是局部变量,函数体执行结束后,已经被释放掉。虽然ptBack 是new出来的,但是new出来的空间,并没有负任何值,虽然指向了trans,但函数体结束后,它指向的内容已经被释放。想要达到目的的话,将数组的内容复制到new出的空间里


受教了哈!明白这个生命周期的道理,可是在指针这里转不过弯来,用你的方法解决了,方法对我来说比较好接受,呵呵。。。
也感谢其它各位!

问题继续:在被调函数中做了指针空间的赋值:
  double trans[3][4] = {5,5,5,5,5,5,5,5,5,5,11,12};
    double *ptBack = new double(12);
    double *ptArray = &trans[0][0];
    for(int i = 0; i < 12; i++)
        *(ptBack+i) = *(ptArray+i);
然后在哪儿delete ptBack?main里边?
double *ptReturn = transpose();
delete ptReturn;

因为在被调函数中这个指针空间可能比较大,在哪儿free呢?
[ 此帖被yangfanxing在2010-03-12 11:27重新编辑 ]
PHPWind好恶心。。。不想看这种界面。。。
离线benbenmajia

只看该作者 7楼 发表于: 2010-03-12
如果是new出来的要delete,如果是在堆上声明的不用delete
安然.....
离线北落师门
只看该作者 8楼 发表于: 2010-03-12
引用第6楼yangfanxing于2010-03-12 10:59发表的  :
受教了哈!明白这个生命周期的道理,可是在指针这里转不过弯来,用你的方法解决了,方法对我来说比较好接受,呵呵。。。
也感谢其它各位!
.......

你new的是数组 要用delete[]
还有复制可以直接用memcpy
还有最好不要在函数内new然后返回个指针出来 调用函数的人不delete的话 就是内存泄露
最好用STL里的容器 vector或者 QT的QVector
离线yangfanxing
只看该作者 9楼 发表于: 2010-03-12
引用第8楼北落师门于2010-03-12 14:46发表的  :
你new的是数组 要用delete[]
还有复制可以直接用memcpy
还有最好不要在函数内new然后返回个指针出来 调用函数的人不delete的话 就是内存泄露
最好用STL里的容器 vector或者 QT的QVector


嗯,很好的建议!我也采纳了~
PHPWind好恶心。。。不想看这种界面。。。
快速回复
限100 字节
 
上一个 下一个