24小时热门版块排行榜    

查看: 1075  |  回复: 11
本帖产生 1 个 程序强帖 ,点击这里进行查看
当前只显示满足指定条件的回帖,点击这里查看本话题的所有回帖

江湖小白生

新虫 (初入文坛)

[求助] C++求助

#include
#include
using namespace std;
char *getname(void);
int main()
{
  char *name;
  name=getname();
  cout<   delete[] name;
  name=getname();
  cout<   delete[]name;
  return 0;
}
char *getname()
{
char temp[80];
cout<<"enter the name:";
cin>>temp;
char *pn=new char(strlen(temp)+1);
strcpy(pn,temp);
return pn;
}
回复此楼
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

sudo

木虫 (正式写手)

【答案】应助回帖

★ ★
余泽成(金币+2, 程序强帖+1): 谢谢参与应助! 2011-11-10 21:44:28
引用回帖:
6楼: Originally posted by ioadong at 2011-11-04 16:32:57:
你再看看那个错误提示框中的内容。清清楚楚的"heap buffer"
你说的是另外一个问题,即指针越界的问题,但这不是出现图中错误对话框的原因。
我特地复习了一下,new分配的变量一般都是在堆空间的。

再来看看这个问题是怎么产生的,VC在debug模式下进行编译的时候,使用的delete会调用crt\src\dbgheap.c里面的这个函数:
CODE:
/***
*int _CrtCheckMemory() - check heap integrity
*
*Purpose:
*       Confirm integrity of debug heap. Call _heapchk to validate underlying
*       heap.
*
*Entry:
*       void
*
*Return:
*       TRUE - if debug and underlying heap appear valid
*       FALSE otherwise
*
*******************************************************************************/
extern "C" _CRTIMP int __cdecl _CrtCheckMemory(void);

然后,会在delete的时候,对堆进行一个详细的检查,其中有一段是这样的:
CODE:
if (!CheckBytes(pbData(pHead) + pHead->nDataSize, _bNoMansLandFill,
                nNoMansLandSize))
                {
                    if (pHead->szFileName)
                    {
                        _RPT5(_CRT_WARN, "HEAP CORRUPTION DETECTED: after %hs block (#%d) at 0x%p.\n"
                            "CRT detected that the application wrote to memory after end of heap buffer.\n"
                            _ALLOCATION_FILE_LINENUM,
                            blockUse,
                            pHead->lRequest,
                            (BYTE *) pbData(pHead),
                            pHead->szFileName,
                            pHead->nLine);
                    }
                    else
                    {
                        _RPT3(_CRT_WARN, "HEAP CORRUPTION DETECTED: after %hs block (#%d) at 0x%p.\n"
                            "CRT detected that the application wrote to memory after end of heap buffer.\n",
                            blockUse, pHead->lRequest, (BYTE *) pbData(pHead));
                    }
                    okay = FALSE;
                }

它使用CheckBytes发现了写在了申请到的堆内存空间范围的后面,然后就给程序员报了个_CRT_WARN。

以上~
8楼2011-11-04 17:08:52
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
查看全部 12 个回答

江湖小白生

新虫 (初入文坛)

运行结果是这样



2楼2011-11-04 11:10:10
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

ioadong

木虫 (著名写手)

【答案】应助回帖


xzhdty(金币+1): 欢迎常来程序语言讨论 2011-11-04 22:25:58
char *getname()
{
char temp[80];
cout<<"enter the name:";
cin>>temp;
char *pn=new char(strlen(temp)+1);//这里分配了局部指针
strcpy(pn,temp);
return pn;//这里返回这个指针,但是在函数返回后,这个变量的生命期已经结束了。
}

这个函数返回了在堆中分配的临时指针pn。楼主好好看看教材上关于指针用法的注意点吧。
以科学的理性代替天然的非理性。
3楼2011-11-04 14:58:23
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

sudo

木虫 (正式写手)

引用回帖:
3楼: Originally posted by ioadong at 2011-11-04 14:58:23:
char *getname()
{
char temp[80];
cout<<"enter the name:";
cin>>temp;
char *pn=new char(strlen(temp)+1);//这里分配了局部指针
strcpy(pn,temp);
return pn;//这里返回这个指针 ...

这个解释是不对的~你搞混了栈和堆
4楼2011-11-04 15:37:29
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
最具人气热帖推荐 [查看全部] 作者 回/看 最后发表
[公派出国] 售SCI-T0P文章,我:8O.5.5.1.O.54,科目齐全,可+急 +3 k0dTPqJtl0jt 2026-08-14 4/200 2026-08-15 04:45 by 4wMiSEwB6436
[考博] 售SCI文章,我:8O.5.5.1O.54,科目全,可十急 +4 k0dTPqJtl0jt 2026-08-14 5/250 2026-08-15 04:45 by 4wMiSEwB6436
[考研] 售SCI文章,我:8O5.5.1.O.54,科目齐全,可+急 +3 7lpolszZVXgi 2026-08-14 6/300 2026-08-15 04:21 by 4wMiSEwB6436
[找工作] 售SCI文章,我:8O5.5.1.O.54,科目齐全,可+急 +4 k0dTPqJtl0jt 2026-08-14 4/200 2026-08-15 02:21 by 4wMiSEwB6436
[基金申请] 小木虫上这么多卖论文的,真有人买论文么?感觉没必要啊 +11 Tide man 2026-08-10 12/600 2026-08-15 02:12 by home3163
[考研] 售SCI一区T0P文章,我:8.O.55.1.O.54,科目齐全,可+急 +4 HFw0lei2R37i 2026-08-14 8/400 2026-08-15 00:16 by 4wMiSEwB6436
[基金申请] 咱们一起用铁证分析2026国家社科基金中标与否 +7 启萌科技 2026-08-12 22/1100 2026-08-14 23:45 by Noways
[基金申请] 哪位老哥知道今年的国自然具体哪一天放榜? +5 Ldrop2023 2026-08-13 5/250 2026-08-14 18:48 by ssxclkj
[基金申请] 应该是93bebmhtak前后十一个字符比较关键 +23 Lanmanbaby 2026-08-09 37/1850 2026-08-14 13:40 by Equinoxhua
[论文投稿] 职称评审,求友友推荐见刊最快的期刊 +5 工厂打螺丝 2026-08-08 5/250 2026-08-14 11:03 by 玖戈弋
[硕博家园] 读博的好处 +4 lnee 2026-08-11 4/200 2026-08-14 10:20 by ahsoarli
[基金申请] filecode +15 documentary 2026-08-10 17/850 2026-08-14 10:08 by kissu88
[基金申请] 我的国基提前知道中了,可是同事的操作让我实在接受不了,怎么会有这样的人 +10 家与远方 2026-08-10 15/750 2026-08-14 02:08 by 绵羊哥哥
[基金申请] Filecode 又变了,巨变 +3 WH3796 2026-08-12 4/200 2026-08-13 14:13 by 小木虫6752397
[基金申请] 2019年青年基金涵评意见,大家看看几个A,几个B? +11 Tide man 2026-08-11 11/550 2026-08-13 07:35 by 撸猫猫
[基金申请] 综述论文作为代表作会不会影响评审专家的印象分? +11 yufeiwaner 2026-08-09 13/650 2026-08-12 08:17 by yufeiwaner
[基金申请] 为什么网上很多人说本周 12号出结果 +6 瞬息宇宙 2026-08-10 7/350 2026-08-11 19:25 by Tide man
[基金申请] 确定了,国自然21号放榜 +6 布布和一二 2026-08-10 7/350 2026-08-10 19:15 by 2000zf36392
[基金申请] 国自然结果 +4 Vierhys 2026-08-10 8/400 2026-08-10 15:06 by Vierhys
[基金申请] fileCode有新解读? +10 Tide man 2026-08-08 18/900 2026-08-09 12:55 by 仁砚薪传
信息提示
请填处理意见