VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 2187|回复: 13

这块内存如何释放?

[复制链接]

1

主题

1

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-2-10 20:00:02 | 显示全部楼层 |阅读模式
前几天写个函数,要适应有一个参数和两个参数的情况,就想到了写重载。
后来又想,是不是非要写重载呢,就试了试默认参数的方式。就是下面这小段代码。
现在的问题是,如何判断要不要释放内存,怎么判断那块内存有没产生?

#include <iostream.h>

int f(int i,int &j=*new int(1))
{

        j=i;
        return i;
}

void main()
{
        int a,b,c,d=0;

        a=f(d);
        b=f(d,c);
        cout<<"a="<<a<<endl;
        cout<<"b="<<b<<endl;
        cout<<"c="<<c<<endl;
        cout<<"d="<<d<<endl;
}
回复

使用道具 举报

0

主题

55

帖子

44.00

积分

新手上路

Rank: 1

积分
44.00
发表于 2020-4-5 09:45:02 | 显示全部楼层
int f(int i,int j=1 )
{

        j=i;
        return i;
}
回复

使用道具 举报

0

主题

14

帖子

15.00

积分

新手上路

Rank: 1

积分
15.00
发表于 2020-4-5 23:45:01 | 显示全部楼层
没辙,
1)函数总有约定,你得约定传入的参数必须是动态分配的。
2)尽量用重载而不是默认参数。
回复

使用道具 举报

0

主题

24

帖子

9.00

积分

新手上路

Rank: 1

积分
9.00
发表于 2020-4-6 09:15:01 | 显示全部楼层
no method

you should record the pointer
回复

使用道具 举报

0

主题

37

帖子

28.00

积分

新手上路

Rank: 1

积分
28.00
发表于 2020-4-7 11:30:01 | 显示全部楼层
我不懂为什么这个地方要new呢。
你丢失了指针,怎么去delete呢?
回复

使用道具 举报

0

主题

6

帖子

6.00

积分

新手上路

Rank: 1

积分
6.00
发表于 2020-4-9 08:15:01 | 显示全部楼层
创建的东西应该可以算是j本身吧,只能在函数内部处理;假设函数内部处理了,j又怎么办?
回复

使用道具 举报

0

主题

5

帖子

34.00

积分

新手上路

Rank: 1

积分
34.00
发表于 2020-4-9 16:14:23 | 显示全部楼层
int f(int i,int j=1)  好像这样也可以。
回复

使用道具 举报

1

主题

8

帖子

7.00

积分

新手上路

Rank: 1

积分
7.00
发表于 2020-4-9 20:45:01 | 显示全部楼层
int f(int i,int &j=*new int(1))
是个什么定义啊,先不说这种定义多怪,j是一个引用,j赋值为new的地址吗?要是地址的话你转换一下让大家都明白,否则你定义有问题。
回复

使用道具 举报

0

主题

4

帖子

5.00

积分

新手上路

Rank: 1

积分
5.00
发表于 2020-5-16 23:15:01 | 显示全部楼层
// crt_va.c
/* The program below illustrates passing a variable
* number of arguments using the following macros:
*      va_start            va_arg              va_end
*      va_list             va_dcl (UNIX only)
*/

#include <stdio.h>
#define ANSI            /* Comment out for UNIX version     */
#ifdef ANSI             /* ANSI compatible version          */
#include <stdarg.h>
int average( int first, ... );
#else                   /* UNIX compatible version          */
#include <varargs.h>
int average( va_list );
#endif

int main( void )
{
   /* Call with 3 integers (-1 is used as terminator). */
   printf( "Average is: %d\n", average( 2, 3, 4, -1 ) );

   /* Call with 4 integers. */
   printf( "Average is: %d\n", average( 5, 7, 9, 11, -1 ) );

   /* Call with just -1 terminator. */
   printf( "Average is: %d\n", average( -1 ) );
}

/* Returns the average of a variable list of integers. */
#ifdef ANSI             /* ANSI compatible version    */
int average( int first, ... )
{
   int count = 0, sum = 0, i = first;
   va_list marker;

   va_start( marker, first );     /* Initialize variable arguments. */
   while( i != -1 )
   {
      sum += i;
      count++;
      i = va_arg( marker, int);
   }
   va_end( marker );              /* Reset variable arguments.      */
   return( sum ? (sum / count) : 0 );
}
#else       /* UNIX compatible version must use old-style definition.  */
int average( va_alist )
va_dcl
{
   int i, count, sum;
   va_list marker;

   va_start( marker );            /* Initialize variable arguments. */
   for( sum = count = 0; (i = va_arg( marker, int)) != -1; count++ )
      sum += i;
   va_end( marker );              /* Reset variable arguments.      */
   return( sum ? (sum / count) : 0 );
}
#endif
回复

使用道具 举报

2

主题

9

帖子

8.00

积分

新手上路

Rank: 1

积分
8.00
发表于 2020-6-26 19:45:02 | 显示全部楼层
1楼的办法很好, 你直接塞个默认值给它呀
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

快速回复 返回顶部 返回列表