【发布时间】:2014-07-03 12:58:42
【问题描述】:
两者在内存分配方面有什么区别
struct_type * mystruct = new struct_type();
和
struct_type *mystruct = new struct_type[1];
?
【问题讨论】:
标签: c++ pointers memory-management struct
两者在内存分配方面有什么区别
struct_type * mystruct = new struct_type();
和
struct_type *mystruct = new struct_type[1];
?
【问题讨论】:
标签: c++ pointers memory-management struct
我认为这两行代码在内存分配方面没有区别。
【讨论】:
他们将分配相同数量的可见/可用内存,即保存一个对象所需的内存。但语义不同,前者是指向单个对象的指针,而后者是包含一个对象的数组。在取消分配时,您应该使用
delete mystruct;
第一种情况
delete []mystruct;
第二种情况。
另一个区别是编译器必须保存一些关于后一种情况的簿记信息,例如它必须知道数组中的项目数,以便可以正确删除它。当然,您的structure 必须有一个默认构造函数才能在后一种情况下使用。
【讨论】:
这取决于您所说的“内存分配差异”的含义。
首先,new 和new[] 是两个独立的内存分配机制,它们可以(并且将)分配不同内部布局的内存,例如与分配的内存块相关的不同实现相关的家庭信息。重要的是要记住,第一个分配必须与delete 配对,第二个分配必须与delete [] 配对。此外,由于这个原因,在典型的实现中,第二次分配可能会比第一次消耗更多的内存。
其次,您在第一次分配中使用的初始化语法() 会触发已分配对象的值初始化。同时,在您的第二次分配中,您根本没有提供初始化程序。根据struct_type 类的具体情况,这可能会导致初始化的显着差异。例如,如果struct_type 定义为struct struct_type { int x; },则第一个分配保证将mystruct->x 设置为零,而第二个分配将在mystruct->x 中留下一个垃圾值。您必须执行new struct_type[1]() 才能消除这种(可能是无意的)差异。
【讨论】:
第一行将创建一个结构对象并将其地址返回给您的指针。 第二行将创建一个包含 1 个结构对象的数组,并将数组的起始地址返回给您的指针
【讨论】: