内存动态分配释放的问题

xiaoxiaoluo 2011-04-23 10:19:04
刚结的贴,但还是有问题
char *str[2100010]
char* nowp, *init;
nowp = (char *)malloc(sizeof(char));
init = nowp;
for(i = 0; i < n; i++)
{
scanf("%d %s", &len[i], nowp);
str[i] = nowp;
nowp = nowp + len[i] + 1;
}
free(init);
释放那里报错。。。
...全文
211 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
翱翔的苍鹰 2011-05-31
  • 打赏
  • 举报
回复
// char* nowp, *init;
//nowp = (char *)malloc(sizeof(char));
需要多申请点内存,还有释放free(itit)不对,应该是free(nowp);
CMT100 2011-04-25
  • 打赏
  • 举报
回复
说一下你这段程序真正要干什么吧,或许你的思路有问题。强烈建议~~
xiaoxiaoluo 2011-04-25
  • 打赏
  • 举报
回复
可以了,我memset(str,0,sizeof(str))写成memset(str,0,sizeof(str[0]))了。。。。题目是poj 3376有兴趣的可以看下
Sou2012 2011-04-25
  • 打赏
  • 举报
回复
init 没有分配内存。
xiaoxiaoluo 2011-04-24
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 robert6757 的回复:]

楼主就是为了记住创建内存时的地址,才要free(init)的。怎么能free(nowp)。
建议楼主跟下代码到赋值的部分吧。就是scanf的部分。
还有就是建议不要让用户去输入长度吧,直接去strlen不就可以了。安全放心。
[/Quote]
poj 的题目,只是一个程序中输入的片段,因为字符串输入都是不定的,要根据len[i]输入来,所以想这样省空间。。
一根烂笔头 2011-04-24
  • 打赏
  • 举报
回复

#include <iostream>
#include <malloc.h>
using namespace std;

int main()
{
char *str[2100];//原先很大,我运行时出现错误
int len[10];
char* nowp, *init;
nowp = (char *)malloc(sizeof(char)*100);
init = nowp;
for(int i = 0; i < 2; i++)
{
scanf("%d %s", &len[i], nowp);
str[i] = nowp;
nowp = nowp + len[i] + 1;
}
free(init);

return 0;
}


建议使用new与delete。

下面给你说一下为什么使用new、delete而不是malloc与free

在纯c中只提供了malloc与free来动态的管理内存。
而在c++中拓展了这一功能,就是使用了new与delete来动态管理内存。不过它比malloc与free多干些活,因此会有优越性。

优越性:
1.new在分配内存时候,会构建对象,调用对象的构造函数,也就是说它不像malloc那样简单的根据自己需要分配指定字节的内存然后就不问。

2.同理,delete与free相对,也是如此。free只回收内存。不会处理多余的垃圾。而delete除了回收内存,还调用对象的析构函数。
CMT100 2011-04-24
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 alweeq86 的回复:]
C/C++ code

char* nowp, *init;
nowp = (char *)malloc(sizeof(char));
free(init);//你并没有为init申请内存,所以释放时会出错 你可以free nowp
[/Quote]
5楼理解错了。代码中init = nowp;
所以init和nowp指向了同一块内存。
lemonlinger 2011-04-24
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 alweeq86 的回复:]
C/C++ code

char* nowp, *init;
nowp = (char *)malloc(sizeof(char));
free(init);//你并没有为init申请内存,所以释放时会出错 你可以free nowp
[/Quote]

up!!
xiaoxiaoluo 2011-04-24
  • 打赏
  • 举报
回复
换new ,delete一样错,nowp申请的空间是为了保存一组字符串的,加起来最多有200000,所以不能申请小
辰岡墨竹 2011-04-24
  • 打赏
  • 举报
回复
输入的话,一般分配255个字节都足够了,不需要动态分配,就算是要动态增长,一般也是8个字节、32个字节为单位的,一个一个效率低,而且占用内存比较大,因为另有结构记录块的大小。
一个malloc要对应一个free。因为堆里是有结构的,你每申请一次,它会记录大小和位置的。所以你free时也必须对应,不能随便给一个就free的。
也就是说你多malloc的必须要用循环一一free。
self001 2011-04-24
  • 打赏
  • 举报
回复
在堆中new申请的内存需要delete,
robert6757 2011-04-23
  • 打赏
  • 举报
回复
楼主就是为了记住创建内存时的地址,才要free(init)的。怎么能free(nowp)。
建议楼主跟下代码到赋值的部分吧。就是scanf的部分。
还有就是建议不要让用户去输入长度吧,直接去strlen不就可以了。安全放心。
alweeq86 2011-04-23
  • 打赏
  • 举报
回复

char* nowp, *init;
nowp = (char *)malloc(sizeof(char));
free(init);//你并没有为init申请内存,所以释放时会出错 你可以free nowp


xiaoxiaoluo 2011-04-23
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 happymawolf 的回复:]

nowp = (char *)malloc(sizeof(char));
你只申请了一个字节的长度,应该申请多些内存!
[/Quote]
我写错了,那样写还是会报错。。。是 nowp = (char *)malloc(sizeof(char)*10000);
str用来保存nowp的指针位置啊,nowp动态申请就是为了存字符串,它有好多组都存在nowp里面。感觉没错啊。
pathuang68 2011-04-23
  • 打赏
  • 举报
回复
越界了
书虫 2011-04-23
  • 打赏
  • 举报
回复
比如:
nowp = (char *)malloc(sizeof(char)*10000);
书虫 2011-04-23
  • 打赏
  • 举报
回复
nowp = (char *)malloc(sizeof(char));
你只申请了一个字节的长度,应该申请多些内存!

64,650

社区成员

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

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