我有一个函数,该函数使用存储在结构A中的信息。该函数经常被调用,并且在大多数情况下,它只能依赖于存储在A中的信息。 在某些(罕见)条件下,不能使用A的对象之一。必须创建一个新对象,并且该对象的生存期不得超过该函数的寿命(因为它只能使用一次并占用大量存储空间)。 我有一些伪代码来演示我的问题。目前,我真的不喜欢它,因为调用了“ new”,但我想不出另一种方法来使用智能指针来完成此操作。
正如我在每本书中读到的那样,如今您不应该直接使用指针,而要依靠智能指针,所以我不确定是否可以正确实现我想要的东西。
struct A{
myData data;
}
void often_called_function(int i, A &structA)
{
// Pointer which shall dynamically point to existing or newly created object
myData *current_data;
// we rarely land here, data can't be used
if (i == 10) {
current_data = new myData(special arguments);
current_data->reinit(i);
}
// most of the time we land here, no need to re-create data, just reinit existing data from struct A
else {
structA.data.reinit(i);
current_data = &structA.data;
}
// do more stuff with current_data
current_data->do_something();
}
因此,基本上我正在寻找一种“更精细”的安全方法来实现这一目标,有人可以帮助我吗? 预先感谢
答案 0 :(得分:2)
您可以创建一个智能指针来拥有新对象,并在函数末尾释放它,但是除非您需要创建新对象,否则将其设为空。创建它时,只需使current_data
引用由智能指针管理的对象即可:
void often_called_function(int i, A &structA)
{
// Pointer which shall dynamically point to existing or newly created object
myData *current_data;
// smart pointer that will own the dynamically-created object, if needed:
std::unique_ptr<myData> owner;
// we rarely land here, data can't be used
if (i == 10){
owner = std::make_unique<myData>(special_arguments);
current_data = owner.get();
current_data->reinit(i);
}
// most of the time we land here, no need to re-create data, just reinit existing data from struct A
else{
structA.data.reinit(i);
current_data = &structA.data;
}
// do more stuff with current_data
current_data->do_something();
}
看起来您可以通过将reinit(i)
调用移出条件分支来简化该函数:
// we rarely land here, data can't be used
if (i == 10){
owner = std::make_unique<myData>(special_arguments);
current_data = owner.get();
}
// most of the time we land here, no need to re-create data, just reinit existing data from struct A
else{
current_data = &structA.data;
}
current_data->reinit(i);