如何分配一个结构然后增加它的大小?

How to allocate a struct and then increase its size?

我有一个结构数据

struct dataStruct{
  int mID;
  float mX;
};

一个fillData方法

void fillData(data *pt)
{
  pt = new data(10);
}

main函数

int main(int argc, char** argv)
{
  dataStruct *myData;
  fillData(myData);

  myData[4].mID = 10;

  std::cout <<  myData[4].mID << " " << myData[5].mID << std::endl;
}

还有几个问题:

我在猜测你想要什么,因为它不清楚。

这里有一个更好的方法来处理需要动态改变大小的对象集合:

struct dataStruct
{
    dataStruct() : mID(0), mX(0.0f) {} // default to value 0

    dataStruct(int mID, float mX) : mID(mID), mX(mX) {}

    int mID;
    float mX;
};

int main(int argc, char** argv)
{   
    std::vector<dataStruct> myData(10); // create 10 objects with values 0

    myData[4].mID = 10;

    std::cout <<  myData[4].mID << " " << myData[5].mID << std::endl;

    // now resize to 100 objects, with 0 values for any new objects
    myData.resize(100);

    std::cout <<  myData[4].mID << " " << myData[99].mID << std::endl;
}

实例: http://ideone.com/5nyPOp

没有内存泄漏!没有未初始化的数据(在您的原始代码中使用)。好的调试编译器会为你检查边界。

对于第一个问题,fillData() 需要接受参考文献

void fillData(data *&pt)      // makes change of pt visible to the caller
{
  pt = new data(10);
}

int main()
{
    data *pointer;
    fillData(pointer);
}

或指向指针的指针

void fillData(data **pt)      // makes change of *pt visible to the caller
{
  *pt = new data(10);
}

int main()
{
    data *pointer;
    fillData(&pointer);    // pass the address of pointer
}

对于第二个问题,不知何故fillData()需要被告知要分配多少对象,并能够释放。

void fillData(data *&pt, int size)
{
    delete [] pt;
    pt = new data[size];
}

int main()
{
    data *pointer = NULL;    //  otherwise first call of fillData() will fail on the delete statement

    fillData(10);
     //   use pointer like an array of 10 elements

    fillData(20);   //   note previous contents of pointer are lost

     //   use pointer like an array of 10 elements
}

第三个问题的答案:简答:否。

第三个问题的详细答案:如果您想要一组可调整大小的 data,请改用标准容器(例如 std::vector<data>)。这样做的一个优点是标准容器可以干净地调整大小(例如,如果从 10 个元素调整到 20 个元素,则保留前十个元素)。

注意:可以调整直接用 operator new 分配的东西的大小(例如,通过额外的簿记来跟踪当前和新的大小)但我没有在上面的例子中这样做 - 因为使用标准容器在实践中是一种更好的方法。