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

时间:2015-04-10 09:54:29

标签: c++ memory struct new-operator

我有一个struct 数据

struct dataStruct{
  int mID;
  float mX;
};

fillData 方法

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

功能

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

  myData[4].mID = 10;

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

以及几个问题:

  • 如何在 fillData 方法中分配 myData ,以便分配不是 fillData 的本地?
  • myData 的大小可以通过以后调用 fillData 来增加,从而将大小从10改为100?
  • 使用 std :: unique_ptr 管理 dataStruct 指针会更好吗?

2 个答案:

答案 0 :(得分:1)

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

这是处理大小需要动态更改的对象集合的更好方法:

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

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

答案 1 :(得分:1)

对于第一个问题,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分配的内容(例如,使用额外的簿记来跟踪当前和新的大小)但我在上面的示例中没有这样做 - 因为使用标准容器在实践中是一种更好的方法。