指向对象的指针数组的动态分配

Posted

技术标签:

【中文标题】指向对象的指针数组的动态分配【英文标题】:Dynamic Allocation of an Array of Pointers to Objects 【发布时间】:2009-11-22 18:21:26 【问题描述】:

这个问题是用 C++ 编写的。 我正在尝试动态分配指向对象的指针数组。 我知道我可以使用矢量容器,但练习的重点不是......

代码如下:

void HealthClub::AddHealthClubDevice ( char* HealthClubDeviceName )
                                       //We added NumberOfDevices as an attribute, so we won't have to use sizeof all the time
    if (NumberOfDevices==0)  // This is for the first device we want to add
    
        HealthClubDevices = new Device*[1];
        HealthClubDevices[0]= new Device(HealthClubDeviceName);
        NumberOfDevices++;
    
    else        // Here we did realloc manually...
    
        Device** tempHealthClubDevices;
        tempHealthClubDevices = new Device*[++NumberOfDevices];  //this is where we see the first sign of a problem, The tempHealthClubDevices is not allocated properly

        for (int i=0 ; i<(NumberOfDevices-1) ; i++)
         tempHealthClubDevices[i]=HealthClubDevices[i];
        delete[] HealthClubDevices;          
        HealthClubDevices = tempHealthClubDevices;
        HealthClubDevices[NumberOfDevices-1]= new Device(HealthClubDeviceName);
   

Device** 对象没有正确分配,它们的大小永远不会增长,它们始终是一个元素。 有谁知道为什么? 谢谢!

【问题讨论】:

是不是每次都会出现这个问题?有没有可能是 new 运算符无法分配足够的内存? 每次都会出现这种情况,绝对不是内存问题。 我没有发现您发布的代码有任何问题。尽管您的评论说“添加 NumberOfDevices 作为属性,所以我们不必一直使用 sizeof”令人不安。 sizeof 运算符不会给您分配的设备数量。 【参考方案1】:

无法重现您的问题。具体来说,这里是我编译并成功运行的所有骨架代码——你的方法加上最小的脚手架使它成为一个完整的程序:

#include <iostream>

struct Device 
  char* name;
  Device(char* n) name = n;
;

struct HealthClub 
  int NumberOfDevices;
  Device** HealthClubDevices;
  HealthClub()  NumberOfDevices = 0;
  void AddHealthClubDevice(char *);
;

std::ostream& operator<<(std::ostream& o, const HealthClub& h) 
  o << h.NumberOfDevices << " devices:" << std::endl;
  for(int i=0; i<h.NumberOfDevices; ++i) 
    o << "  " << h.HealthClubDevices[i]->name << std::endl;
  
  o << "That's all!\n" << std::endl;
  return o;


void HealthClub::AddHealthClubDevice ( char* HealthClubDeviceName )
                                       //We added NumberOfDevices as an attribute, so we won't have to use sizeof all the time
    if (NumberOfDevices==0)  // This is for the first device we want to add
    
        HealthClubDevices = new Device*[1];
        HealthClubDevices[0]= new Device(HealthClubDeviceName);
        NumberOfDevices++;
    
    else        // Here we did realloc manually...
    
        Device** tempHealthClubDevices;
        tempHealthClubDevices = new Device*[++NumberOfDevices];  //this is where we see the first sign of a problem, The tempHealthClubDevices is not allocated properly

        for (int i=0 ; i<(NumberOfDevices-1) ; i++)
         tempHealthClubDevices[i]=HealthClubDevices[i];
        delete[] HealthClubDevices;          
        HealthClubDevices = tempHealthClubDevices;
        HealthClubDevices[NumberOfDevices-1]= new Device(HealthClubDeviceName);
   


int main() 
  HealthClub h;
  std::cout << h;
  h.AddHealthClubDevice("first");
  std::cout << h;
  h.AddHealthClubDevice("second");
  std::cout << h;
  h.AddHealthClubDevice("third");
  std::cout << h;
  return 0;

即使使用 --pedantic 也可以正常编译,并且在运行时发出:

$ ./a.out 
0 devices:
That's all!

1 devices:
  first
That's all!

2 devices:
  first
  second
That's all!

3 devices:
  first
  second
  third
That's all!

根据需要。因此,您的问题的原因必须在其他地方。鉴于您的真实程序失败(您没有向我们确切展示如何)和这个成功的最小程序,您可以“通过二等分插值”来构建最小的失败案例——如果这仍然不能告诉您问题出在哪里,发布最小的失败案例和比它小的一个 epsilon 仍然成功作为 SO 问题肯定可以为您提供所需的帮助(请务必同时指定编译器、操作系统等)。

【讨论】:

以上是关于指向对象的指针数组的动态分配的主要内容,如果未能解决你的问题,请参考以下文章

如何得到指针指向的数组的长度

为啥在 C 中为数组声明和指向数组声明的指针动态分配的内存不同? [复制]

指向 C++ 中动态分配的二维数组中的一行的指针

怎么动态分配指针数组

动态分配的指向结构(链表)的指针数组,以及如何访问每个列表?

指向动态二维字符数组的三重指针的内存分配