我有一个类,其中包含一个在构造函数中动态分配的指针数组。这个类还有一个函数来填充数组。
HolderClass::HolderClass(int number)
{
arrayOfPointers = new ItemClass*[number];
}
HolderClass::addItem(int number, ItemClass item)
{
arrayofPointers[number] = &item;
}
尽管这会编译,但我的理解是正确的,因为我实际上会用悬空指针填充数组,因为 item 变量的生命周期仅在 addItem 函数的持续时间内?
用指向传入项的指针填充 arrayOfPointers 的正确方法是什么?这里的一个复杂性是 ItemClass 的子类将被传递给 addItem 函数,所以我不相信可以使用默认的复制构造函数。
编辑:此代码适用于 Arduino,因此我在能做什么和不能做什么方面相当有限。这也意味着我想为此类的用户简单地保留东西(因为有很多 Arduino 新手)并且不要求他们传递指向 addItem 函数的指针(这将要求他们管理传递的生命周期在 ItemClass 对象中)。
最佳答案
What would be the correct way of populating the arrayOfPointers with pointers to the passed in items?
首先,不要使用原始的new
和delete
。使用容器和智能指针。
struct HolderClass
{
std::unique_ptr<std::unique_ptr<ItemClass>[]> arrayOfPointers;
// ...
};
HolderClass::HolderClass(int number)
{
arrayOfPointers = std::make_unique<std::unique_ptr<ItemClass>[]>(number);
}
然后,将指针传递给 addItem
而不是值以避免对象切片和生命周期问题:
HolderClass::addItem(int number, std::unique_ptr<ItemClass> item)
{
arrayofPointers[number] = std::move(item);
}
关于c++ - 在函数中填充指针数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44394619/