麒麟子

~~

导航

<2010年4月>
28293031123
45678910
11121314151617
18192021222324
2526272829301
2345678

统计

常用链接

留言簿(12)

随笔分类

随笔档案

Friends

WebSites

积分与排名

最新随笔

最新评论

阅读排行榜

评论排行榜

函数中分配内存的问题

只是为了能够让自己讲清一些事!

大家都知道,如果想要在在C++的函数中分配内存,那么就只得使用指针的引用传递,或是二级指针

如:

 

而通常我们在开始的学习中,都会写成

void MyNew(int* p)

{

   p = new int;

}

 

为什么这样分配不会成功呢?

原理很简单,就是形参传递时的拷贝。

当p传入进MyNew的时候,函数内部会对其进行拷贝。而函数内部真正操作和分配到了内存的,就是那个考贝后的变量。

偽代码如下:

void MyNew(int* p)

{

    int* temp = p;

   temp = new int;

}

 

不言而寓,最终p也没有得到想要分配给他的址。

 

而上面两种方式,采用了引用的,就不会产生拷贝,自然就不用解释了。

而采用二级指针的,我们同样用偽码可以看到。

void MyNew(int** p)

{

    int** temp = p;

   *temp = new int;

}

 

虽然同样是进行了拷贝,但是由于 temp和p同样指向一个地方,则*temp正好就是我们想要分配给它地址的那个值,所以最后得到了想要的结果!!!

posted on 2010-04-27 22:52 麒麟子 阅读(1747) 评论(11)  编辑 收藏 引用

评论

# re: 函数中分配内存的问题 2010-04-27 23:50 hoodlum1980

只要知道参数一般是通过栈传递的就能理解了。比如push, pop这样的操作。
所以要改变某值,需要的参数是它的地址。  回复  更多评论   

# re: 函数中分配内存的问题 2010-04-27 23:54 小时候可靓了

可以用栈来解释,但老兄你可以说详细点。不然有人会疑惑的!  回复  更多评论   

# re: 函数中分配内存的问题 2010-04-28 09:02 俏物悄语购物网站

时空的发生的南方  回复  更多评论   

# re: 函数中分配内存的问题 2010-04-28 09:12 小时候可靓了

@俏物悄语购物网站
你再乱发广告,我要上门问候了!  回复  更多评论   

# re: 函数中分配内存的问题 2010-04-28 09:26 zuhd

buddy, some asm code will make it clear!  回复  更多评论   

# re: 函数中分配内存的问题 2010-04-28 10:06 丽可酷

爱神的箭阿萨合适的  回复  更多评论   

# re: 函数中分配内存的问题 2010-04-28 11:01 小时候可靓了

我完全不懂汇编,就算我懂,我也不能保证别人也完全懂汇编!!!呵呵! 有些东西,讲得太专业,也未必是好事!
不过谢谢各位建议,下回用汇编讲!  回复  更多评论   

# re: 函数中分配内存的问题 2010-04-28 22:23 turygo

c++的话,为什么参数不用引用?这样可以避免多个指针的问题  回复  更多评论   

# re: 函数中分配内存的问题 2010-05-04 19:02 hoodlum1980

昨天我就疏忽之下犯了这么一个错误。
主要是我在一个函数里面反复的调用了realloc,在调用前已经分配好一个初始内存地址。但是只是传递的是指针的值。。。结果如果realloc没有改变起始地址,就没有问题,一旦起始地址变了,问题就来了,导致进程意外退出。后来我才发现这个问题呀。
realloc可能会为了分配更大的空间而移动这块内存。从而使地址发生改变。  回复  更多评论   

# re: 函数中分配内存的问题[未登录] 2010-05-04 21:21 欲三更

这个东西要是学C、C++的起点吧? 要是连这个都不知道,那就是根本就没学过C/C++了。  回复  更多评论   

# re: 函数中分配内存的问题 2010-05-05 07:58 小时候可靓了

@欲三更
很多人知道的,但很多人只是知道,并不知道为什么自己知道!
我上面也只是说的表面现象。 如果到这一层次就以为自己完全知道了,那个就不好讲了。。。 现在猛男很多,但新手也多。 像我这样的新手,就更多。。。  回复  更多评论   


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理