【问题标题】:Initialize a pointer to struct syntax初始化指向结构语法的指针
【发布时间】:2014-07-03 12:58:42
【问题描述】:

两者在内存分配方面有什么区别

struct_type * mystruct = new struct_type();

struct_type *mystruct = new struct_type[1];

【问题讨论】:

    标签: c++ pointers memory-management struct


    【解决方案1】:

    我认为这两行代码在内存分配方面没有区别。

    【讨论】:

      【解决方案2】:

      他们将分配相同数量的可见/可用内存,即保存一个对象所需的内存。但语义不同,前者是指向单个对象的指针,而后者是包含一个对象的数组。在取消分配时,您应该使用

      delete mystruct;
      

      第一种情况

      delete []mystruct; 
      

      第二种情况。

      另一个区别是编译器必须保存一些关于后一种情况的簿记信息,例如它必须知道数组中的项目数,以便可以正确删除它。当然,您的structure 必须有一个默认构造函数才能在后一种情况下使用。

      【讨论】:

      • “它们将分配相同数量的内存,即容纳一个对象所需的内存”...嗯,实际上,不会。 返回的指针在每种情况下都指向相同数量的分配内存,但在第二种情况下,编译器可以(并且在某些情况下确实如此——clang++和g++都这样做)分配“簿记信息”连同数组。在第二种情况下也可能分配其他与对齐相关的内存。
      • @Massa,你是对的。我的意思是 usable/visible 数量将是相同的。还评论了第二种情况的簿记开销。
      【解决方案3】:

      这取决于您所说的“内存分配差异”的含义。

      首先,newnew[] 是两个独立的内存分配机制,它们可以(并且将)分配不同内部布局的内存,例如与分配的内存块相关的不同实现相关的家庭信息。重要的是要记住,第一个分配必须与delete 配对,第二个分配必须与delete [] 配对。此外,由于这个原因,在典型的实现中,第二次分配可能会比第一次消耗更多的内存。

      其次,您在第一次分配中使用的初始化语法() 会触发已分配对象的值初始化。同时,在您的第二次分配中,您根本没有提供初始化程序。根据struct_type 类的具体情况,这可能会导致初始化的显着差异。例如,如果struct_type 定义为struct struct_type { int x; },则第一个分配保证将mystruct->x 设置为零,而第二个分配将在mystruct->x 中留下一个垃圾值。您必须执行new struct_type[1]() 才能消除这种(可能是无意的)差异。

      【讨论】:

        【解决方案4】:

        第一行将创建一个结构对象并将其地址返回给您的指针。 第二行将创建一个包含 1 个结构对象的数组,并将数组的起始地址返回给您的指针

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-10-19
          • 1970-01-01
          相关资源
          最近更新 更多