我为一个C++类实现了一个class,它使用其他对象的共享指针来访问它们。当然,在我的can中,我只能获得原始指针。因此,我将class中的原始指针“转换”为一个共享指针,然后与我的C++类方法一起使用它:
method(std::shared_ptr<dataType>(raw-pointer));现在,我遇到的问题是,在“方法”的末尾总是调用共享指针析构函数,不幸的是,它杀死了我的原始指针所指向的对象(我不想看到这个对象)。那么,我怎样才能防止原始指针被杀死呢?
我已经试过了一些共享指针函数,比如重置()或交换(),但是它们都没有让我的原始指针离开.
bool Traffic_doStep(traffic_handle t, environment_handle e, double cycletime) {
if (!valid(t, __FUNCTION__)) return false;
if (!valid(e, __FUNCTION__)) return false;
if (!valid(cycletime, __FUNCTION__)) return false;
try {
t->doStep(std::shared_ptr<Environment>(e), cycletime);
return true;
}
catch (const std::exception& e) {
std::cerr << e.what() << std::endl;
return false;
}
}预期的结果是,在此函数返回后,原始指针e仍然指向有效的对象。实际上,原始指针指向被删除的对象。
发布于 2019-08-14 15:18:05
不要将指针放在std::shared_ptr中
智能指针在C++中的目的是提供自动的生命周期管理。当您编写std::shared_ptr<int> ptr{raw_ptr};时,期望当ptr超出范围时,raw_ptr指向的对象将是deleted。如果这不是目的,则不应该将指针放置在智能指针中。
因此,如果应用程序不管理指针的生存期,那么存储原始指针是完全可以接受的。
如果函数后面的API无法更改,则需要使用无op删除函数构造std::shared_ptr,以便在调用清理时,指针不会发生任何变化。
try {
std::shared_ptr<Environment> temp_ptr{e, [](int *) {}/*No-Op Deleter*/};
t->doStep(temp_ptr, cycletime);
return true;
}这将解决您的问题,但这当然是一个反模式;不要这样做,除非您已经迫于API的设计约束,您无法控制。
发布于 2019-08-14 15:21:31
您可以提供共享指针的自定义删除器。
下面是一个可行的构造函数:
template< class Y, class Deleter >
shared_ptr( Y* ptr, Deleter d );但我宁愿使用唯一的指针,然后释放它。
https://stackoverflow.com/questions/57497517
复制相似问题