请教函数体里申请内存函数体个怎么自动释放?

冷风1023 2018-03-22 07:05:41
typedef struct{

int i;

char *p;

}test;

这个函数的接口是定义死的
void f(vector<test> &v)

{

char *pt = (char *)malloc(sizeof(char) *10);

//这里做一些值的拷贝;

v.push_back(pt);//这里功能上不确定有多少个pt值,所以只能用vector来保存

}

int main()

{

vector<test> V;

f(V);

/*************************

这里用V值做一些处理

******************************/

//这里只能一个个的释放吗?有没有办法做到自动释放????麻烦知道的大拿能给点例子。

for (vector<char *> iterator iter = V.begin();iter!=V.end();iter++){

free(*iter);

}


}
...全文
513 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
冷风1023 2018-03-27
  • 打赏
  • 举报
回复
回复19楼,我第10楼用的智能指针方法对吗?
xiaoxiangqing 2018-03-24
  • 打赏
  • 举报
回复
使用智能指针是可以
Saleayas 2018-03-23
  • 打赏
  • 举报
回复
vector 能 push_back 进去 char const * 吗?
冷风1023 2018-03-23
  • 打赏
  • 举报
回复
回复9,如果有了智能指针还需要copy construct 和 operator= 吗
冷风1023 2018-03-23
  • 打赏
  • 举报
回复
回复12,不行啊,这个指针指向的内容很大,有几十K,一会栈就暴了。
名叫猫的鱼 2018-03-23
  • 打赏
  • 举报
回复
我也觉得包在一个类中,做个拷贝构造函数和析构函数应当能解决
starytx 2018-03-23
  • 打赏
  • 举报
回复
引用 11 楼 starytx 的回复:
直接用vactor<string>啊
vector<string>
starytx 2018-03-23
  • 打赏
  • 举报
回复
直接用vactor<string>啊
冷风1023 2018-03-23
  • 打赏
  • 举报
回复
还有你的test类,应该有一个copy construct 和 operator= 你都没有提供,必然出错。 这个我也有想过,但不知道具体怎么实现,可否给个简单的例子。 我用智能指针实现了下,测试可以,不知道有没有其它问题 typedef boost::shared_array<char> MYptr typedef struct{ int i; //char *p; MYptr p; }test; void f(vector<test> &v) { test t = {0}; char *pt = (char *)malloc(sizeof(char) *10); /*******************************/ MYptr ptr(pt); t.p = ptr; t.i = 1; //这里做一些值的拷贝; v.push_back(t);//这里功能上不确定有多少个pt值,所以只能用vector来保存 } int main() { vector<test> V; f(V); /************************* 这里用V值做一些处理 ******************************/ //这里只能一个个的释放吗?有没有办法做到自动释放????麻烦知道的大拿能给点例子。 //or (vector<char *> iterator iter = V.begin();iter!=V.end();iter++){ // free(iter->pt); } }
真相重于对错 2018-03-23
  • 打赏
  • 举报
回复
引用 7 楼 zjjone 的回复:
回复真相重于对错 在test析构函数里释放的话,那么在f的函数f里定义的t局部就放掉了,就推不到vector里了。
请详细学习一下vector 当你把一个对象放入vector ,降调用那个的对象复制构造函数,创建一个新的对象副本,并把它放入容器。
真相重于对错 2018-03-23
  • 打赏
  • 举报
回复
你既然用c++,请使用c++的思考方式 还有你的test类,应该有一个copy construct 和 operator= 你都没有提供,必然出错。
冷风1023 2018-03-23
  • 打赏
  • 举报
回复
回复真相重于对错 在test析构函数里释放的话,那么在f的函数f里定义的t局部就放掉了,就推不到vector里了。
ztenv 版主 2018-03-23
  • 打赏
  • 举报
回复
使用shared_ptr吧,
fly4free 2018-03-23
  • 打赏
  • 举报
回复
引用 14 楼 zjjone 的回复:
回复12,不行啊,这个指针指向的内容很大,有几十K,一会栈就暴了。
给你一个模板流程: 把 test 定义成类,char *类型成员如果仅保存字符串,那不如定义成 std::string ,如果保存其他数据的,也没关系。 1) 编写拷贝构造函数:test(const test& t) { ... } —— 在里面对 char* 类等成员进行数据值的复制(就是深拷贝咯) 2) 重载赋值操作符:test& operator=(const test& t) { ... } 除了同上操作,别忘了 return *this; 这算是标准返回模板了 3) 编写析构函数 ~test() { ... } 在里面,做资源释放 这样,在使用 vector<test> V; 等操作后,就不用 free 了,自动完成释放 ( 其实不是自动,是你在上面析构函数里自己手动写的) 上述操作是在堆中申请内存,不是栈。粗略算起,你有2G 内存可用,实际上会少点儿。
  • 打赏
  • 举报
回复
用操作系统的内存管理,GlobalAlloc、GlobalFree之类的。
真相重于对错 2018-03-22
  • 打赏
  • 举报
回复
既然用C++为什么不用new 和delete 还有vector<test>容器里面是值类型不用直接释放 test里面pt 需要释放,最好是在test 的析构函数里面释放
冷风1023 2018-03-22
  • 打赏
  • 举报
回复
使用智能指针 std::shared_ptr 使用析构函数 具体怎么做呢
冷风1023 2018-03-22
  • 打赏
  • 举报
回复
刚刚那个程序少点打了东西 typedef struct{ int i; char *p; }test; void f(vector<test> &v) { test t = {0}; char *pt = (char *)malloc(sizeof(char) *10); t.p = pt; t.i = 1; //这里做一些值的拷贝; v.push_back(t);//这里功能上不确定有多少个pt值,所以只能用vector来保存 } int main() { vector<test> V; f(V); /************************* 这里用V值做一些处理 ******************************/ //这里只能一个个的释放吗?有没有办法做到自动释放????麻烦知道的大拿能给点例子。 for (vector<char *> iterator iter = V.begin();iter!=V.end();iter++){ free(iter->pt); } }
AlbertS 2018-03-22
  • 打赏
  • 举报
回复
理论上谁申请的内存应该由谁来释放,如果这个接口不能改,那么只能通过vec里记录的信息来释放,vec里记录的又是零散的内存块,那么只能遍历一个个释放喽!
yxwsbobo 2018-03-22
  • 打赏
  • 举报
回复
使用智能指针 std::shared_ptr 使用析构函数

64,282

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧