我有一个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;
}
以及几个问题:
答案 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;
}
没有内存泄漏!没有未初始化的数据(在原始代码中使用)。好的调试编译器会为你检查。
答案 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
分配的内容(例如,使用额外的簿记来跟踪当前和新的大小)但我在上面的示例中没有这样做 - 因为使用标准容器在实践中是一种更好的方法。