如何分配一个结构然后增加它的大小?
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;
}
还有几个问题:
- 如何在 fillData 方法中分配 myData 以便分配不是 fillData[=36 的本地分配=]?
- myData 的大小是否可以通过稍后调用 fillData 来 增加 并因此改变大小从 10 到 100 ?
- 使用 std::unique_ptr 管理 dataStruct 指针会更好吗?
我在猜测你想要什么,因为它不清楚。
这里有一个更好的方法来处理需要动态改变大小的对象集合:
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;
}
没有内存泄漏!没有未初始化的数据(在您的原始代码中使用)。好的调试编译器会为你检查边界。
对于第一个问题,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
分配的东西的大小(例如,通过额外的簿记来跟踪当前和新的大小)但我没有在上面的例子中这样做 - 因为使用标准容器在实践中是一种更好的方法。
我有一个结构数据
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;
}
还有几个问题:
- 如何在 fillData 方法中分配 myData 以便分配不是 fillData[=36 的本地分配=]?
- myData 的大小是否可以通过稍后调用 fillData 来 增加 并因此改变大小从 10 到 100 ?
- 使用 std::unique_ptr 管理 dataStruct 指针会更好吗?
我在猜测你想要什么,因为它不清楚。
这里有一个更好的方法来处理需要动态改变大小的对象集合:
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;
}
没有内存泄漏!没有未初始化的数据(在您的原始代码中使用)。好的调试编译器会为你检查边界。
对于第一个问题,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
分配的东西的大小(例如,通过额外的簿记来跟踪当前和新的大小)但我没有在上面的例子中这样做 - 因为使用标准容器在实践中是一种更好的方法。