Lar*_*mer 1 c++ shared-ptr c-api raw-pointer
我为C ++类实现了C-API,该类使用其他对象的共享指针来访问它们。在我的C-API中,我当然只能获得原始指针。因此,我将C-API中的原始指针“转换”为共享指针,然后将其与C ++类方法一起使用:
method(std::shared_ptr<dataType>(raw-pointer));
Run Code Online (Sandbox Code Playgroud)
现在,我遇到的问题是,在“方法”的末尾,总是会调用共享指针析构函数,并且不幸的是,它杀死了我的原始指针指向的对象(我不想要)。因此,如何防止原始指针被杀死?
我已经尝试过像reset()或swap()这样的共享指针功能,但是它们都没有让我的原始指针走...
method(std::shared_ptr<dataType>(raw-pointer));
Run Code Online (Sandbox Code Playgroud)
预期的结果是,此函数返回后,原始指针e仍指向有效对象。实际上,原始指针然后指向已删除的对象。
Xir*_*ema 11
std::shared_ptrC ++中的智能指针的目的是提供自动的生命周期管理。当您编写时std::shared_ptr<int> ptr{raw_ptr};,期望的是ptr超出范围时,所指向的对象raw_ptr将是delete'd。如果这不是目的,则不应将指针放在智能指针中。
因此,如果您的应用程序无法管理指针的生存期,那么存储原始指针是完全可以接受的。
如果该函数后面的API无法更改,则需要std::shared_ptr使用no-op deleter函数构造,以便调用清理时指针不会发生任何变化。
try {
std::shared_ptr<Environment> temp_ptr{e, [](int *) {}/*No-Op Deleter*/};
t->doStep(temp_ptr, cycletime);
return true;
}
Run Code Online (Sandbox Code Playgroud)
这将解决您的问题,但这当然是反模式;除非您因无法控制的API设计约束而被迫这样做,否则请不要这样做。
| 归档时间: |
|
| 查看次数: |
126 次 |
| 最近记录: |