C++ 动态指向现有对象或创建新对象
我有一个函数,它使用存储在结构a中的信息。这个函数经常被调用,大多数时候它只能依赖存储在结构a中的信息。 在某些(罕见)情况下,不能使用的对象之一。必须创建一个新对象,并且它的寿命不应超过函数的寿命(因为它只能使用一次,并且占用大量存储空间)。 我有一点伪代码来说明我的问题。目前我真的不喜欢它,因为有人叫我“新”,但我想不出另一种方法来用智能指针来实现这一点 正如我在每本书中读到的那样,现在你不应该直接使用指针,而应该依赖智能指针,我不确定是否应该正确地实现我想要的C++ 动态指向现有对象或创建新对象,c++,pointers,smart-pointers,C++,Pointers,Smart Pointers,我有一个函数,它使用存储在结构a中的信息。这个函数经常被调用,大多数时候它只能依赖存储在结构a中的信息。 在某些(罕见)情况下,不能使用的对象之一。必须创建一个新对象,并且它的寿命不应超过函数的寿命(因为它只能使用一次,并且占用大量存储空间)。 我有一点伪代码来说明我的问题。目前我真的不喜欢它,因为有人叫我“新”,但我想不出另一种方法来用智能指针来实现这一点 正如我在每本书中读到的那样,现在你不应该直接使用指针,而应该依赖智能指针,我不确定是否应该正确地实现我想要的 struct A{ my
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();
}
所以,基本上我在寻找一个“更好”和安全的方法来实现这一点,有人能帮我吗?
提前感谢您可以创建一个智能指针来拥有新对象,并在函数末尾将其释放,但除非您需要创建新对象,否则将其设置为空。创建时,只需将
当前_数据
引用由智能指针管理的对象即可:
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();
}
使用
共享\u ptr
?如果我在else中为共享指针分配“&structA.data”,它会不会在structA.data超出范围时尝试销毁它(因此在函数结束后)?
// 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);