我正在学习关于c++11的特性,特别是shared_ptr,并且在引用this并将其作为其他类的引用时遇到了问题。
这么做的原因是我有一个Simulation实例,它被传递给模拟中的其他实例(例如Apple),以便它们可以修改模拟,甚至从模拟中删除自己。
在我的更复杂的代码中,当程序退出时,我会得到double free错误(根据 from here,我应该不要在同一原始对象上两次创建shared_ptr)。当Simulation类不知道this已经是shared_ptr时,如何将this作为shared_ptr传递给Apple对象?
我的想法是在初始化参数中传递shared_ptr,但那似乎是多余的,例如:
也许我在尝试以一种不寻常的方式实现它,或者我的理解还不够正确?也许有更好的方法来完成这个任务呢?
下面是一个简化的示例:
这么做的原因是我有一个Simulation实例,它被传递给模拟中的其他实例(例如Apple),以便它们可以修改模拟,甚至从模拟中删除自己。
在我的更复杂的代码中,当程序退出时,我会得到double free错误(根据 from here,我应该不要在同一原始对象上两次创建shared_ptr)。当Simulation类不知道this已经是shared_ptr时,如何将this作为shared_ptr传递给Apple对象?
我的想法是在初始化参数中传递shared_ptr,但那似乎是多余的,例如:
// The argument is a std::shared_ptr<Simulation>
simulation->initSomethingElse(simulation);
也许我在尝试以一种不寻常的方式实现它,或者我的理解还不够正确?也许有更好的方法来完成这个任务呢?
下面是一个简化的示例:
#include <memory>
class Simulation;
class Apple {
public:
void init(std::shared_ptr<Simulation> simulation) {
this->simulation = simulation;
};
private:
std::shared_ptr<Simulation> simulation;
};
class Simulation {
public:
void initSomethingElse() {
auto apple = std::shared_ptr<Apple>(new Apple());
// incorrect second reference to the raw pointer
apple->init(std::shared_ptr<Simulation>(this));
};
};
int main() {
auto simulation = std::shared_ptr<Simulation>(new Simulation());
simulation->initSomethingElse();
return 0;
}
shared_ptr<Simulation>
实例? - Dai