内存分配问题

[复制链接]
 楼主| 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
从堆上申请到的内存地址一定要保存好,将来释放的时候还要把这个地址传回去,不然会出问题的 ...

要养成好的编程习惯
comeon201208 发表于 2013-12-30 23:22 | 显示全部楼层
这些我也跟着学习的啦,编程的时候很重要的
pkat 发表于 2013-12-31 20:30 | 显示全部楼层
需要将地址传回去
骗子的片子 发表于 2014-2-26 19:03 来自手机 | 显示全部楼层
堆栈的问题很重要
xsgy123 发表于 2014-2-27 18:30 | 显示全部楼层
无冕之王 发表于 2013-12-30 18:53
从堆上申请到的内存地址一定要保存好,将来释放的时候还要把这个地址传回去,不然会出问题的 ...

可以试试
您需要登录后才可以回帖 登录 | 注册

本版积分规则

177

主题

1653

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部