读书人

临时开辟内存怎么回收

发布时间: 2012-03-08 13:30:13 作者: rapoo

临时开辟内存,如何回收?
今天突发奇想,

C/C++ code
char *convertDecimalToBinary(int value){//十进制转换为二进制    char *s = new char[10];      itoa(value, s, 2);    return s;} 

这么一个函数,临时开辟10个char的内存大小,但是需要怎么回收呢?
函数会在结束后自动回收吗?如果不是,那么这样会照成内存溢出吗?


[解决办法]
如果不放心的话,可以改变下函数的声明和调用方式
char *convertDecimalToBinary(int value);
改为:
char *convertDecimalToBinary(int value,char *buf);
由调用者负责开辟和回收内存
[解决办法]
对啊,数组撤销的形式是delete []变量名,单个变量就是delete 变量名。
[解决办法]
return回去的是地址,所以你可以调用完后在delete
比如是这样调用:
C/C++ code
char* temp = convertDecimalToBinary(10);//程序逻辑delete[] temp;//逻辑完成后delete....
[解决办法]
你返回的内存在堆里面,当然函数结束时,不会自动销毁了
[解决办法]
像这种情况,要在函数说明中指出来,由调用者释放
[解决办法]
C/C++ code
char *convertDecimalToBinary(int value){//十进制转换为二进制    char *s = new char[10];      itoa(value, s, 2);    return s;} char *str = convertDecimalloBinary(10);printf("%s\r\n",str);delete []str;
[解决办法]
lz 去看一下 林锐写的 《高质量c/C++编程》
char *convertDecimalToBinary(int value)
{//十进制转换为二进制
char *s = new char[10];
itoa(value, s, 2);
return s;
} 函数返回s,函数外部释放s指向的内存。
[解决办法]
楼主的需要在这里,返回一个std::vector<char>是再合适不过了!
[解决办法]
itoa(value, s, 2);
看下 原来的函数参数
自己这样包装下就好了
char *convertDecimalToBinary(int value,char *str);
C/C++ code
#include <iostream>#include <string>#include <algorithm>#include <vector>#include <stdio.h>using namespace std;char * convertDecimalToBinary(int value,char *str);int main(){    char str[10];    char *pstr = convertDecimalToBinary(8,str);    printf("%s\r\n",str);    printf("%s\r\n",pstr);    return 0;}char * convertDecimalToBinary(int value,char *str){    //十进制转换为二进制    itoa(value, str, 2);    return str;}
[解决办法]
用内存池啊,哈哈。
[解决办法]
这个有神马突发奇想的,这么用的多了。
好多软件包甚至VC++都这么用。大家对有些函数用过需要release的有印象吧,都是不同形式的资源释放。
别人云亦云说什么谁分配谁释放,那只是个传说。
哥这样用的多了去了。
C/C++ code
BYTE* GetBuffer(int n){BYTE* s = new BYTE[n];return s;}void ReleaseBuffer(BYTE*s){delete [] s;}
[解决办法]
这个例子可以用static来实现, 不过在多线程中不适用.
一般来说谁申请谁释放, 参数是这种形式是最好的:
C/C++ code
void convertDecimalToBinary(int value, char * s, int length)
[解决办法]
探讨

楼主的需要在这里,返回一个std::vector<char>是再合适不过了!

[解决办法]
总结上面的有三种方法均可行
1.使用STL容器,就不用自己回收了
2.在函数外部开辟区域,并传入开辟区域的指针到函数
char *convertDecimalToBinary(int value,char *buf);
3.函数外释放资源,这种应该是楼主最想要的见37楼



[解决办法]
该函数退出的时候,指针s会自动消亡的,但是s指向的内存并不会自动释放。
这样才可以return回去。
如果要要释放,需要在调用该函数的函数中使用delete []x;
x为主调函数中接受该北调函数return回来的指针!
可参见林锐的《高质量程序设计指南——C++\C语言》的16.5小节!
[解决办法]
为什么你不放在一个struct里面,然后return struct
[解决办法]
char *convertDecimalToBinary(int value)
{//十进制转换为二进制
char *s = new char[10];
itoa(value, s, 2);
delete[] s;
s = NULL
return s;
}
说明: new出来的内存是在堆内存中,所以需要手动释放,对于的释放用delete
[解决办法]
我个人认为四楼的兄弟的做法比较好,不过在函数定义的时候还是有一些谬误,这个函数没必要返回值。这种工具函数一般不要赋予它分配内存的权限,应该把持谁分配谁释放的原则,使new和delete成对出现,这样你的程序的可读性就大大地增强了。

这个函数这样定义比较好一些:
void convertDecimalToBinary(int value,char *buf){
atoi(value, buf, 2);
}
使用的时候可以这样写:
char* test=new char[10];
convertDecimalToBinary(8,test);
cout<<test<<endl;
delete[] test;
这样写程序既简洁又规范,不易出问题。
[解决办法]
建议还是使用:char *convertDecimalToBinary(int value,char *buf);
调用者负责分配与释放(显式delete []),
即使使用atuo_ptr 也是一样的:还是需要在调用者上定义ator_ptr<char*> pbuf=new char[10];只是在pbuf生命期结束时,系统会自动释放pbuf 内存,不需要显式delete [];

读书人网 >C++

热点推荐