免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 1993 | 回复: 10
打印 上一主题 下一主题

▲究竟何时该释放内存 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-12-31 23:55 |只看该作者 |倒序浏览
#include <vector>
#include <algorithm>
#include <iostream>

using namespace std;

typedef struct  
{
        int keyLen;     
        char *recordKey;  
}keyElement;

void allc(vector<keyElement> &idx)
{
        string names[] = {"jack", "mike"};

        for(int i = 0; i <2; i++)
        {
                keyElement tmp;
                tmp.keyLen = names[i].length();
                tmp.recordKey = new char[tmp.keyLen];
                strcpy(tmp.recordKey, (const char *)names[i].c_str());               
                idx.push_back(tmp);
                //delete [] tmp.recordKey;  //这里删除会出错:导致main中无法访问index中数据
        }
}


int main()
{
        vector<keyElement> index;

        allc(index);
        cout<<index[0].recordKey<<" "<<index[1].recordKey<<endl;
        cout<<index.size()<<endl;

//        delete [] index[0].recordKey;   //这里删除为什么也会出错呢?
//        delete [] index[1].recordKey;
        return 0;
}

论坛徽章:
0
2 [报告]
发表于 2007-01-01 00:02 |只看该作者
报什么错???
手头没有机器,不能帮你跑跑看。

论坛徽章:
0
3 [报告]
发表于 2007-01-01 00:24 |只看该作者
错误如下

e-1.gif (6.64 KB, 下载次数: 12)

allc中

allc中

e2.gif (6.43 KB, 下载次数: 15)

main中

main中

论坛徽章:
0
4 [报告]
发表于 2007-01-01 00:30 |只看该作者
tmp.recordKey = new char[tmp.keyLen+1];

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
5 [报告]
发表于 2007-01-01 00:30 |只看该作者
tmp.recordKey = new char[tmp.keyLen];
是不是应该为:
tmp.recordKey = new char[tmp.keyLen+1];

论坛徽章:
0
6 [报告]
发表于 2007-01-01 00:33 |只看该作者
由于你的keyElement没有重载operator=和拷贝构造函数(即没有重新为字符串分配空间),所以不能在allc函数中删除分配的空间

论坛徽章:
0
7 [报告]
发表于 2007-01-01 00:38 |只看该作者
原帖由 tyc611 于 2007-1-1 00:33 发表
由于你的keyElement没有重载operator=和拷贝构造函数(即没有重新为字符串分配空间),所以不能在allc函数中删除分配的空间



怎么解决呢? 我还没怎么用过运算符重载;

论坛徽章:
0
8 [报告]
发表于 2007-01-01 00:40 |只看该作者
原帖由 lenovo 于 2007-1-1 00:30 发表
tmp.recordKey = new char[tmp.keyLen];
是不是应该为:
tmp.recordKey = new char[tmp.keyLen+1];


我修改了以后解决了, 原因是什么呢? 我分配了tmp.keyLen的内存, 又删除了这么多, 不是理所当然吗?为什么会出错?

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
9 [报告]
发表于 2007-01-01 00:41 |只看该作者
原帖由 JustUSTC 于 2007-1-1 00:40 发表


我修改了以后解决了, 原因是什么呢? 我分配了tmp.keyLen的内存, 又删除了这么多, 不是理所当然吗?为什么会出错?

你要弄清楚string和char *之间的差别。
那个1是用来存放'\0'的,
点到为止,自己好好想想。

论坛徽章:
0
10 [报告]
发表于 2007-01-01 02:20 |只看该作者
原帖由 JustUSTC 于 2007-1-1 00:40 发表


我修改了以后解决了, 原因是什么呢? 我分配了tmp.keyLen的内存, 又删除了这么多, 不是理所当然吗?为什么会出错?

可能原因是,因为你少分配了一个字节空间,因而最后的'\0'占用了分配的动态空间后面一个字节,而这个字节可能参予存放动态分配空间的大小等信息(不同编译器的分配策略不一样,不要做太多假设,这儿只是分析你的可能原因),所以这个数据被修改,很难预料释放空间时会发生什么

[ 本帖最后由 tyc611 于 2007-1-1 02:21 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP