广告广告
  加入我的最爱 设为首页 风格修改
首页 首尾
 手机版   订阅   地图  繁体 
您是第 5102 个阅读者
 
发表文章 发表投票 回覆文章
  可列印版   加为IE收藏   收藏主题   上一主题 | 下一主题   
ebolaman 手机 会员卡
个人文章 个人相簿 个人日记 个人地图
特殊贡献奖

级别: 副版主 该用户目前不上站
版区: 程式设计
推文 x38 鲜花 x458
分享: 转寄此文章 Facebook Plurk Twitter 复制连结到剪贴簿 转换为繁体 转换为简体 载入图片
推文 x0
[C/C++][求助] [已解决] 指标变数用 delete 发生记忆体错误
最近练一个类似 Online Judge 的题目,结果一直错误,请教如何解决

题目 : https://gpe2.acm-icpc.tw//showproblemtab.php?probid=2008-01&cid=2




我写的 C 程式码 :



#include<stdio.h>
#include<stdlib.h>

/*========== Prototype ==========*/
void renew_realloc_pos(int*, int, int*);
bool renew_plus_pos(int*, int*, int*);
/*_______________________________*/


int main()
{
    int maxNum = 0, lenNum = 0;
    int val_case = 1;
    int* pos;

    while (scanf("%d %d", &maxNum, &lenNum) == 2)
    {

        /*----- Initialize -----*/
        pos = new int;

        pos = 1;
        renew_realloc_pos(pos, 1, &maxNum);

        /*----- Output -----*/
        int rep = 1, i = 0;

        printf("case ..

访客只能看到部份内容,免费 加入会员 或由脸书 Google 可以看到全部内容



[ 此文章被ebolaman在2011-10-03 21:30重新编辑 ]



My BOINC stats :

献花 x0 回到顶端 [楼 主] From:台湾教育部 | Posted:2011-09-16 13:44 |
Freelife
数位造型
个人文章 个人相簿 个人日记 个人地图
初露锋芒
级别: 初露锋芒 该用户目前不上站
推文 x2 鲜花 x60
分享: 转寄此文章 Facebook Plurk Twitter 复制连结到剪贴簿 转换为繁体 转换为简体 载入图片

输入 "0 0",会当掉是正常的,

pos = new int[lenNum];

当lenNum = 0时,
不就怪怪的......
最小值也要1....

此文章被评分,最近评分记录
财富:50 (by 三仙) | 理由: ^^ 因为您的参与,让程式设计更容易!!


献花 x1 回到顶端 [1 楼] From:台湾中华电信股份有限公司 | Posted:2011-09-30 14:40 |
ebolaman 手机 会员卡
个人文章 个人相簿 个人日记 个人地图
特殊贡献奖

级别: 副版主 该用户目前不上站
版区: 程式设计
推文 x38 鲜花 x458
分享: 转寄此文章 Facebook Plurk Twitter 复制连结到剪贴簿 转换为繁体 转换为简体 载入图片

下面是引用 Freelife 于 2011-09-30 14:40 发表的 : 到引言文
输入 "0 0",会当掉是正常的,

pos = new int[lenNum];

当lenNum = 0时,
不就怪怪的......
最小值也要1....


谢谢!

我没注意到这点


不过我发现就算 没有输入 0 0 这个 case 也会随机地发生记忆体错误

后来我改成宣告 pos[10]  后似乎就解决了,但是不懂这个 delete [] pos; 这到底为何会发生错误

当初 Debug 就是到这一行  delete [] pos;  发生错误

此文章被评分,最近评分记录
财富:50 (by 三仙) | 理由: ^^ 因为您的参与,让程式设计更容易!!


My BOINC stats :

献花 x1 回到顶端 [2 楼] From:台湾教育部 | Posted:2011-09-30 18:14 |
Freelife
数位造型
个人文章 个人相簿 个人日记 个人地图
初露锋芒
级别: 初露锋芒 该用户目前不上站
推文 x2 鲜花 x60
分享: 转寄此文章 Facebook Plurk Twitter 复制连结到剪贴簿 转换为繁体 转换为简体 载入图片

这是因为呢.....
你实际存取的记忆体,
超过你动态配置的大小......

例如第二个输入范例:6 3
你配置3个int的阵列空间
pos = new int[3];

但是,在renew_realloc_pos(...)函式里面,
你实际存取的pos[]阵列,却会取到第6个阵列值,
这样就有记忆体违规存取的问题.....

如果直接宣告成"pos[10] ",
当你存取超过阵列范围的大小时,
应该也是有问题的

此文章被评分,最近评分记录
财富:50 (by ebolaman) | 理由: 谢谢!下次分配记忆体时我要更注意一下长度的宣告!


献花 x1 回到顶端 [3 楼] From:台湾中华电信股份有限公司 | Posted:2011-10-03 10:02 |
ebolaman 手机 会员卡
个人文章 个人相簿 个人日记 个人地图
特殊贡献奖

级别: 副版主 该用户目前不上站
版区: 程式设计
推文 x38 鲜花 x458
分享: 转寄此文章 Facebook Plurk Twitter 复制连结到剪贴簿 转换为繁体 转换为简体 载入图片

下面是引用 Freelife 于 2011-10-03 10:02 发表的 : 到引言文
这是因为呢.....
你实际存取的记忆体,
超过你动态配置的大小......

例如第二个输入范例:6 3
你配置3个int的阵列空间
pos = new int[3];

但是,在renew_realloc_pos(...)函式里面,
你实际存取的pos[]阵列,却会取到第6个阵列值,
这样就有记忆体违规存取的问题.....

如果直接宣告成"pos[10] ",
当你存取超过阵列范围的大小时,
应该也是有问题的


所以,pos 会存取到不该是分配记忆体位置的 区域

却是在 delete [] pos;  才会发生问题呀


之前的焦点一直注意在 new int[]; 与 delete [] pos;  两个地方

原来我又犯了 多1或少1 的错误了


My BOINC stats :

献花 x0 回到顶端 [4 楼] From:台湾教育部 | Posted:2011-10-03 21:29 |

首页  发表文章 发表投票 回覆文章
Powered by PHPWind v1.3.6
Copyright © 2003-04 PHPWind
Processed in 0.016417 second(s),query:16 Gzip disabled
本站由 瀛睿律师事务所 担任常年法律顾问 | 免责声明 | 本网站已依台湾网站内容分级规定处理 | 连络我们 | 访客留言