从内部函数中删除 smart_ptr
remove smart_ptr from inside function
有什么方法可以从函数中销毁 std::shared_ptr
吗?在下面的示例中,如果我在 main()
中将 sptr
设置为 nullptr
它 "destroys" 对象因此调用它 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)
.
如果你想销毁 shared_ptr
里面的 Delete
函数。我想使用 std::move
是更好的选择。
void Delete(shared_ptr<Test>&& obj) //rvalue reference
{
obj = nullptr;
}
并使用
调用函数
Delete(std::move(sptr));
使用 std::move
转移资源的所有权,在此调用后不能在 main
内进一步使用。
有什么方法可以从函数中销毁 std::shared_ptr
吗?在下面的示例中,如果我在 main()
中将 sptr
设置为 nullptr
它 "destroys" 对象因此调用它 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)
.
如果你想销毁 shared_ptr
里面的 Delete
函数。我想使用 std::move
是更好的选择。
void Delete(shared_ptr<Test>&& obj) //rvalue reference
{
obj = nullptr;
}
并使用
调用函数Delete(std::move(sptr));
使用 std::move
转移资源的所有权,在此调用后不能在 main
内进一步使用。