将堆栈变量传递给采用 std::shared 指针的函数
pass stack variable to function that takes a std::shared pointer
如果我有一个全局变量,或者一个堆栈变量,我可以将它传递给一个带有 std::shared_ptr
和模板化 class 的函数,如下所示:
template<class T> class shared_ptr_stack:public std::shared_ptr<T> {
public:
shared_ptr_stack(T * target):std::shared_ptr<T>(target, [](T * t){}){};
};
};
目标是避免在没有剩余引用时破坏或删除内存。代码编译并在测试中工作,但我担心我正在调用未定义的行为或其他一些负面问题。
采用共享指针的函数有权使您的数据无限期保留。它可以将你的数据传递给不同的结构、线程等等。
您的代码意味着当堆栈帧超出范围或在静态销毁时数据变成垃圾,其中任何一个都可能在最后一个共享 ptr 副本死亡之前。
API 获取共享 ptr 是在请求该权利。你在骗它。
除此之外,您的代码没有问题。但是,我会使用工厂函数而不是子类。您还可以使用共享 ptr 的别名 ctor 来获取一些基于 RAII 的报告。
如果我有一个全局变量,或者一个堆栈变量,我可以将它传递给一个带有 std::shared_ptr
和模板化 class 的函数,如下所示:
template<class T> class shared_ptr_stack:public std::shared_ptr<T> {
public:
shared_ptr_stack(T * target):std::shared_ptr<T>(target, [](T * t){}){};
};
};
目标是避免在没有剩余引用时破坏或删除内存。代码编译并在测试中工作,但我担心我正在调用未定义的行为或其他一些负面问题。
采用共享指针的函数有权使您的数据无限期保留。它可以将你的数据传递给不同的结构、线程等等。
您的代码意味着当堆栈帧超出范围或在静态销毁时数据变成垃圾,其中任何一个都可能在最后一个共享 ptr 副本死亡之前。
API 获取共享 ptr 是在请求该权利。你在骗它。
除此之外,您的代码没有问题。但是,我会使用工厂函数而不是子类。您还可以使用共享 ptr 的别名 ctor 来获取一些基于 RAII 的报告。