先给出简单函数例子:
1.
int *getmem(int n)
{
  int *p=new int[n];
  return p;
}
2.
int *geta(int *b)
{
  int a[10];
  对a数组初始化...
  return a;
}
在使用他们时例1没错,例2就有问题了。我不大明白的是函数返回后,里面的局部变量是怎样销毁的,是联着所申请的内存空间(例1中p申请了一块自由存储区)一块也销毁吗?还是只销毁变量

解决方案 »

  1.   

    new出来的数组或者是对象是放在堆里面的。局部变量和函数参数是放在栈里面的,函数返回时就会回收这部分内存。第二个函数中,你返回了一个已经回收了的内存地址,会导致未定义的行为。
      

  2.   

    但有些例子中有返回局部变量的
    简化如下:
    string operator+(const string &,const string &)
    {
      string tmp;
      ...
      return temp;
    }
    这里就返回了一个放栈里的变量不知何解?
      

  3.   

    > 申请的内存空间(例1中p申请了一块自由存储区)一块也销毁吗?还是只销毁变量
    -------------------------
    自己动态申请(new)的内存需要自己手动释放, 否则由系统自动释放.
      

  4.   

    谢谢上面的兄弟对于例1我是明白了,可对于
    string operator+(const string &,const string &)
    {
      string tmp;
      ...
      return temp;
    }
    我就不大明白了好象跟不能返回栈里的变量有矛盾,这里就返回了栈里的变量
      

  5.   

    建议看下关于堆 栈 全局变量的东东下面为一篇经典的文章
    http://www.cppblog.com/oosky/archive/2006/01/21/2958.html
      

  6.   

    但有些例子中有返回局部变量的
    简化如下:
    string operator+(const string &,const string &)
    {
      string tmp;
      ...
      return temp;
    }
    这里就返回了一个放栈里的变量不知何解?
    个人理解:
    因为你的函数有返回值,其实并不是返回temp。
      

  7.   

    非常感谢各位高手。在此鞠躬加分。
    本人在写了一串口通讯驱动程序,测了下使用其receive函数的时间竟然要>=240ms太郁闷了,要是我一次循环多读几组那不一次循环下来得要2、3秒啊。这是怎么回事啊,有没碰到过的给指点下谢谢!
    简化如下:
    for(i<n)
    {
    1.send()发
    ...
    2.receive收
    }
    上面1和2之间没花啥时间,就执行2后要花>=240ms
      

  8.   

    你的第2个是stack内存,由系统来管理,函数返回就回收了.
    而new的是heap内存,必须要delete掉才释放。
    所以2是危险和错误的。
      

  9.   

    可以返回stack里的变量,但除指针以外。
      

  10.   

    使用串口最好用cserialport类,重载parentwindow的wm_rxchar消息处理,因有监控线程可以异步通信。
    你的send然后receive很不可靠.