2 cuenk cuenk 于 2015.05.28 21:21 提问

请问C#这样定义从什么时候开始分配内存

class Arr{
Arr()
{}
}

主程序:
Arr[] a;
a=new Arr[1];//此处是分配引用内存?
a[0]=new Arr;//此处分配内存?

11个回答

caozhy
caozhy   Ds   Rxr 2015.05.28 21:24
已采纳

a是一个对象,是Arr[]类型,a[0]也是一个对象。是Arr类型
前者实例化了一个Arr[]对象,后者实例化了一个Arr对象。

caozhy
caozhy   Ds   Rxr 2015.05.28 21:25

另外,Arr和Arr[]一样,都是引用类型。除非你把Arr定义成结构体。

cuenk
cuenk   2015.05.28 21:26

前一个实例化分配多少内存?是分配保存地址的内存还是分配对象的内存?

caozhy
caozhy   Ds   Rxr 2015.05.28 21:28

C#是自动垃圾回收的语言,除非使用unsafe,否则不用指针。
类似的,C#叫做引用。
刚才回答你了,Arr和Arr[]都是引用类型,两者都存在托管堆上。

bdmh
bdmh   Ds   Rxr 2015.05.28 21:28

都是引用类型,记得结构体是值类型

caozhy
caozhy   Ds   Rxr 2015.05.28 21:30

分配了多少内存不好说。因为代码对齐的需要,一个对象占用的内存不是它所有成员占用内存的总和。除非你用结构体,并且强行指定

cuenk
cuenk   2015.05.28 21:51

那a=new Arr[1]语句是分配了2个堆的内存了吗?
因为我做一个程序,用list的话不是那么方便,想先用a=new Arr[10000]来预留这么多位置,但可能有部分是没用到的,不知道没用的部分会不会占用大量内存

caozhy
caozhy 回复cuenk: 即便按照C++去理解,你说的也完全不沾边。
2 年多之前 回复
caozhy
caozhy 回复cuenk: 什么叫10000个内存堆,你说的完全是你自己的想象。而且完全没有概念。
2 年多之前 回复
cuenk
cuenk 回复caozhy: 也就是说此时还没有预留10000个内存堆去存放Arr?
2 年多之前 回复
caozhy
caozhy Arr[]和Arr是两回事。
2 年多之前 回复
caozhy
caozhy 你根本没概念。用a=new Arr[10000]大概(注意是大概)需要10000x4个字节多一点
2 年多之前 回复
caozhy
caozhy   Ds   Rxr 2015.05.28 21:56

C#是和C++完全不同的语言。不要用C++的思维去理解C#。

wsh1992o
wsh1992o   Rxr 2015.05.29 09:25

Arr[] a 的时候,会为a在堆栈上分配一个空间并标明是a
a=new arr[1]的时候,会在托管堆上分配两块连续空间用来装arr类型的数组的元素,并在堆栈上的a中存储前者的地址

wsh1992o
wsh1992o 回复caozhy: 老师,怎么不说了?请问C#和C++内存分配上有什么不同?别指出错误就不回了啊?
2 年多之前 回复
wsh1992o
wsh1992o 内存一般分为,数值区,代码区,栈区和堆区。C++一般讲堆区栈区,但C#一般讲堆栈stack和堆(托管堆)heap。大神请指导
2 年多之前 回复
caozhy
caozhy lz问的是C#。你说的不知道是什么语言。
2 年多之前 回复
testcs_dn
testcs_dn   Rxr 2015.05.29 13:20

a=new Arr[1];//此处已经分配内存空间了,只是数据还不可用。

共11条数据 1 尾页
Csdn user default icon
上传中...
上传图片
插入图片