打印

内存分配问题

[复制链接]
775|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
gxgclg|  楼主 | 2013-12-30 18:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
以下程序可以完美运行,但是稍微一修改就不行了(具体操作如下),请问这是为什么?谢谢。
#include "stdafx.h"
#include <iostream>
using namespace std;
int main()
{
int (*p)[2]=new int[2][2];
int i,j;
int a[2][2]={1,2,3,4};
for (i=0;i<2;i++)
for (j=0;j<2;j++)
{
p[i][j]=a[i][j];
}
//p=a;
cout<<"p[0][0]的地址为:"<<p[0]<<endl<<endl;
for (i=0;i<2;i++)
{
for (j=0;j<2;j++)
cout<<p[i][j]<<"\t";
cout<<endl;
}
delete[] p;
p=0;
return 0;
}
但是修改一下源程序就不行了(不能删除p指针了),修改后的程序如下:
#include "stdafx.h"
#include <iostream>
using namespace std;
int main()
{
int (*p)[2]=new int[2][2];
int i,j;
int a[2][2]={1,2,3,4};
/*for (i=0;i<2;i++)
for (j=0;j<2;j++)
{
p[i][j]=a[i][j];
}*/
p=a;//使用该语句而注释掉以上两个for循环
cout<<"p[0][0]的地址为:"<<p[0]<<endl<<endl;
for (i=0;i<2;i++)
{
for (j=0;j<2;j++)
cout<<p[i][j]<<"\t";
cout<<endl;
}
delete[] p;//程序在这里会出错
p=0;
return 0;
}

相关帖子

沙发
无冕之王| | 2013-12-30 18:53 | 只看该作者
从堆上申请到的内存地址一定要保存好,将来释放的时候还要把这个地址传回去,不然会出问题的

使用特权

评论回复
板凳
pkat| | 2013-12-30 19:00 | 只看该作者
p=a是重新给指针赋值啊,你把堆上的地址丢弃了,然后给了一个栈上的地址。内存泄漏先不说,你直接delete栈上的内存空间,你觉得合理么?

使用特权

评论回复
地板
火箭球迷| | 2013-12-30 19:11 | 只看该作者
无冕之王 发表于 2013-12-30 18:53
从堆上申请到的内存地址一定要保存好,将来释放的时候还要把这个地址传回去,不然会出问题的 ...

要养成好的编程习惯

使用特权

评论回复
5
comeon201208| | 2013-12-30 23:22 | 只看该作者
这些我也跟着学习的啦,编程的时候很重要的

使用特权

评论回复
6
pkat| | 2013-12-31 20:30 | 只看该作者
需要将地址传回去

使用特权

评论回复
7
骗子的片子| | 2014-2-26 19:03 | 只看该作者
堆栈的问题很重要

使用特权

评论回复
8
xsgy123| | 2014-2-27 18:30 | 只看该作者
无冕之王 发表于 2013-12-30 18:53
从堆上申请到的内存地址一定要保存好,将来释放的时候还要把这个地址传回去,不然会出问题的 ...

可以试试

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

177

主题

1653

帖子

1

粉丝