关于动态分配内存的一点疑惑

若繁 2014-01-10 03:29:44
新手,想请教大家一个问题,对于动态分配内存这种技术来说,是可以按照自己的需求来确定动态分配内存的大小的,但是,看的一些参考书上,利用new运算符讲解的时候还是会设定数组的大小

那既然你用new运算符动态分配内存的时候,指定大小,平常定义数组的时候也指定大小,那这样有什么用呢?

例如

int *p=new int[100];
int a[100]; 实际上你都是在内存中指定了一个400个字节的内存空间

个人感觉丝毫没有节省内存的意思啊

或者 你可以这么定义
int a;
cin>>a;
int *p=new int[a];
int a[a];

我在VS201中测试过,都是可以通过的

谁能给我讲解一下,动态分配内存在实际编程中的作用呢?

而且,由于动态分配的内存是在堆内存中的,效率反而没有直接在栈中定义的效率高

期待高手的解答,谢谢
...全文
327 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
神-气 2014-01-11
  • 打赏
  • 举报
回复
//nArraySize 最小是1,最大是1000 ; 大部分情况是100 int nArraySize = GetContainerSize() //这里平均只需要分配100个字节 BYTE* pBuffer = new BYTE[nArraySize]; //如用数组,则必须声明一个1000字节的数组才能cover住 BYTE BufferArray[1000]
我看你有戏 2014-01-11
  • 打赏
  • 举报
回复
现在的电脑硬件开辟内存,几乎可以忽略不记了 要搞的好点,就搞个内存池玩玩好了啊 new 开辟内存,不是为了快,而是为了灵活的程序员控制内存的大小
i_Seven_ 2014-01-10
  • 打赏
  • 举报
回复
栈大小是有限的,堆空间很大,new可以在运行期才决定数组的大小,而且有的时候需要内存一直存在,在需要的时候才释放...
千树之影 2014-01-10
  • 打赏
  • 举报
回复
一个在编译时确定,一个在运行时确定,差老大了好吧。
lm_whales 2014-01-10
  • 打赏
  • 举报
回复
因为高级语言使用变量名,常量名,而不是具体地址值,来表示内存中的数据。 除了,确定大小的数据外, 还需要,运行时才能决定大小的,不确定大小的数据,这种数据只能动态分配。 如果整个空间,都是用户可用的,程序员可以直接访问的,直接用地址单元的号码; 就可以了,不需要动态分配了。 即使需要动态分配,也是自己写个算法,不需要语言或者库的支持。
jiandingzhe 2014-01-10
  • 打赏
  • 举报
回复
你定义一个数组的大小,那个尺寸是在编译时写死的,在运行时是固定的。 用内存分配器new一个,尺寸可以在运行时才得到。
「已注销」 2014-01-10
  • 打赏
  • 举报
回复
void func(int i) { int arr[i]; //不行 int *arr = new int[i]; //OK }
「已注销」 2014-01-10
  • 打赏
  • 举报
回复
void func(int i) {
fengbangyue 2014-01-10
  • 打赏
  • 举报
回复
引用 3 楼 u013359898 的回复:
嗯,你说的那个很对,但是对于节省内存空间来说,是不是没有太大的意义? 无非就是 如果一个数组写在一个内存块中,如果该内存块结束之后,该数组也就不存在了,但是动态分配的内存可以在我们想释放的地方释放,灵活性比较高 我感觉动态分配内存也就是我上边想到的它的优点了 我看别的参考书上写的是,大概栈空间大约有1M,如果有大数据量的话,栈空间可能会不够,因此会需要动态分配内存(毕竟可以使用虚拟内存)来进行处理吧,但是对于节省空间来说,我真的没有体会到。。。
数组不是只能固定大小的吗?拿你的QQ签名来说,有的人一两个字,有的人几十个字。数组是不是得用几十个字的长度来表示呢?那如果这些签名都是登录时从服务器拉取的,又假如同时有很多玩家同时登录QQ,那会不会突然导致内存占用很高呢?QQ那么多用户,当然他们签名应该是缓存到本地的。
qq120848369 2014-01-10
  • 打赏
  • 举报
回复
1,生命期 2,性能 3,扩展性
derekrose 2014-01-10
  • 打赏
  • 举报
回复
引用 8 楼 u013359898 的回复:
[quote=引用 6 楼 derekrose 的回复:] [quote=引用 3 楼 u013359898 的回复:] 嗯,你说的那个很对,但是对于节省内存空间来说,是不是没有太大的意义? 无非就是 如果一个数组写在一个内存块中,如果该内存块结束之后,该数组也就不存在了,但是动态分配的内存可以在我们想释放的地方释放,灵活性比较高 我感觉动态分配内存也就是我上边想到的它的优点了 我看别的参考书上写的是,大概栈空间大约有1M,如果有大数据量的话,栈空间可能会不够,因此会需要动态分配内存(毕竟可以使用虚拟内存)来进行处理吧,但是对于节省空间来说,我真的没有体会到。。。
节省空间是不可能的 理论上是浪费空间 因为需要维护一个指针以及指针类型的信息[/quote] 版主,有个问题我想问下,假设前边已经动态分配了内存了,假设为p 那么delete p;是释放的是p所指向的内存单元中的内容(p依然存在,是否依然可以使用呢?),还是销毁了p这个指针呢?[/quote] p的值在stack上 p指向的值在heap上
baichi4141 2014-01-10
  • 打赏
  • 举报
回复
引用 楼主 u013359898 的回复:
int a; cin>>a; int a[a];
旧标准不支持这种定义数组的方法
引用 楼主 u013359898 的回复:
由于动态分配的内存是在堆内存中的,效率反而没有直接在栈中定义的效率高
栈的时间效率较高,源于它只用一个栈指针标示内存可用的位置,也就直接导致它几乎没有空间效率和灵活性可言。 举例来说,你先定义一个大小为10000的数组,再定义一个大小为1的变量,在你释放这个变量之前,这个数组所占的内存空间就被定死了。这叫效率高? 堆内存比栈内存最大的优点是灵活,两块堆内存之间可以完全没有任何关系,就这样
若繁 2014-01-10
  • 打赏
  • 举报
回复
引用 6 楼 derekrose 的回复:
[quote=引用 3 楼 u013359898 的回复:] 嗯,你说的那个很对,但是对于节省内存空间来说,是不是没有太大的意义? 无非就是 如果一个数组写在一个内存块中,如果该内存块结束之后,该数组也就不存在了,但是动态分配的内存可以在我们想释放的地方释放,灵活性比较高 我感觉动态分配内存也就是我上边想到的它的优点了 我看别的参考书上写的是,大概栈空间大约有1M,如果有大数据量的话,栈空间可能会不够,因此会需要动态分配内存(毕竟可以使用虚拟内存)来进行处理吧,但是对于节省空间来说,我真的没有体会到。。。
节省空间是不可能的 理论上是浪费空间 因为需要维护一个指针以及指针类型的信息[/quote] 版主,有个问题我想问下,假设前边已经动态分配了内存了,假设为p 那么delete p;是释放的是p所指向的内存单元中的内容(p依然存在,是否依然可以使用呢?),还是销毁了p这个指针呢?
vipcxj 2014-01-10
  • 打赏
  • 举报
回复

LZ到底是从哪里听来的动态分配内存可以节省内存空间的?我从来不记得有这种说法。动态分配内存的最大原因是栈空间是非常有限和珍贵的,你内存可以到32G,那么你new出32G的内存都是有可能的,但系统分配给程序的栈空间可能只有几M。
当然还有个原因就是堆对象只要你不用delete,在整个程序的生命周期中都是有效的。
derekrose 2014-01-10
  • 打赏
  • 举报
回复
引用 3 楼 u013359898 的回复:
嗯,你说的那个很对,但是对于节省内存空间来说,是不是没有太大的意义? 无非就是 如果一个数组写在一个内存块中,如果该内存块结束之后,该数组也就不存在了,但是动态分配的内存可以在我们想释放的地方释放,灵活性比较高 我感觉动态分配内存也就是我上边想到的它的优点了 我看别的参考书上写的是,大概栈空间大约有1M,如果有大数据量的话,栈空间可能会不够,因此会需要动态分配内存(毕竟可以使用虚拟内存)来进行处理吧,但是对于节省空间来说,我真的没有体会到。。。
节省空间是不可能的 理论上是浪费空间 因为需要维护一个指针以及指针类型的信息
若繁 2014-01-10
  • 打赏
  • 举报
回复
引用 1 楼 lg1544650023 的回复:
所谓动态,也就是你想什么时候释放就什么时候释放,但是堆栈上分配的空间只能在程序结束或离开作用域的时候时候才释放空间
嗯,后边的注释的话,很棒,醍醐灌顶啊,谢谢 看来读书,还是不能读的太死
derekrose 2014-01-10
  • 打赏
  • 举报
回复
各有优点,stack上的大小一般是受限的 heap上空间较大 stack效率比较好
若繁 2014-01-10
  • 打赏
  • 举报
回复
嗯,你说的那个很对,但是对于节省内存空间来说,是不是没有太大的意义? 无非就是 如果一个数组写在一个内存块中,如果该内存块结束之后,该数组也就不存在了,但是动态分配的内存可以在我们想释放的地方释放,灵活性比较高 我感觉动态分配内存也就是我上边想到的它的优点了 我看别的参考书上写的是,大概栈空间大约有1M,如果有大数据量的话,栈空间可能会不够,因此会需要动态分配内存(毕竟可以使用虚拟内存)来进行处理吧,但是对于节省空间来说,我真的没有体会到。。。
sleeplacker 2014-01-10
  • 打赏
  • 举报
回复
一个简单的例子
#include <iostream>

using namespace::std;

int main()
{
	int a[4];
	int *b = new int[4];
	/*使用数组b*/
	delete[] b;//如果确定不再使用数组b,可以释放b的空间
	/*虽然可能数组a也不需要被使用,
	 *但是我们不能手动释放数组a的空间,
	 *只有当main函数执行完了以后才自动释放数组a的空间,那么这不是对空间的一种浪费吗
	 */
	return 0;
}
sleeplacker 2014-01-10
  • 打赏
  • 举报
回复
所谓动态,也就是你想什么时候释放就什么时候释放,但是堆栈上分配的空间只能在程序结束或离开作用域的时候时候才释放空间

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧