是否有任何方法可以从函数内部销毁std::shared_ptr
?在下面的示例中,如果我将sptr
设置为main()
中的nullptr
,则它将"破坏"对象,因此将其称为Print()
失败。但是,在Delete()
函数中执行此操作并不能执行此操作。猜测它会随着它的传递而增加。我明白了这一点,但是有什么方法可以覆盖它并减少 Delete()
中的参考数数,因此在这种情况下, obj = nullptr
将其摧毁了吗?
我得到这通常不是您想做的,但是在这种情况下,外部脚本语言需要能够调用函数以实际破坏指向对象的函数,因此拥有Delete(obj)
是理想的。
#include <memory>
#include <string>
#include <iostream>
using namespace std;
class Test{
private:
string name;
public:
Test(string _name) { name = _name; }
void Print() const { cout << name; }
};
void Delete(std::shared_ptr<Test> obj)
{
obj = nullptr;
}
int main(){
shared_ptr<Test> sptr(new Test("Test"));
Delete(sptr);
//sptr = nullptr;
sptr.get()->Print();
}
按值void Delete(shared_ptr<Test> obj)
传递的副本,这是sptr
的增量计数器,因此分配nullptr
降低计数器,但不会销毁基础对象。您可以通过参考而代替void Delete(shared_ptr<Test>& obj)
。
如果要在 Delete
函数中拆除shared_ptr
。我想使用std::move
是更好的选择。
void Delete(shared_ptr<Test>&& obj) //rvalue reference
{
obj = nullptr;
}
并使用
调用该功能Delete(std::move(sptr));
使用std::move
转移资源的所有权,此通话后main
内无法进一步使用。