由于std::shared_ptr<void>不持有类型信息,因此std::dynamic_pointer_cast无法用于std::shared_ptr<void>的转换。std::reinterpret_pointer_cast是C++23中新增的一个转换函数,可以用于在任意类型之间进行智能指针的转换,但它是危险的,因为它不检查类型兼容性。 3. 学习转换函数的用法 std::static_...
shared_ptr<T>可以指向T类型的对象,而shared_ptr<void>可以指向任意类型的内存块。 将shared_ptr<T>向上转换为shared_ptr<void>是一种安全的操作,不会导致未定义的行为。这是因为shared_ptr的内部实现使用了类型擦除技术,将类型信息存储在共享的控制块中,而不是存储在指针本身中。因此,...
但是std::shared_ptr和void*一样不能解决类型安全的问题。 最后在使用了shared_ptr<void>在SDK内部进行类型强转时报错: /Library/android-ndk-r17c/sources/cxx-stl/llvm-libc++/include/memory:4851:16: error: 'void' is not a classTp* __p = dynamic_cast<Tp*>(r.get());^ ~ (~)~/xxx/src/...
使用shared_ptr<void>代替void*可以解决声明周期管理的问题。shared_ptr有足够的类型信息以了解如何正确销毁它指向的对象。 structday{ // ...things... std::shared_ptr<void> user_data; }; structmonth{ std::vector<day> days; std::shared_ptr<void> user_data; }; ... some_day.user_data = st...
void deleteInt(int*p) { delete []p; } //初始化智能指针,并自定义释放规则 std::shared_ptr<int> p7(new int[10], deleteInt); 四shared_ptr常用函数 get()函数,表示返回当前存储的指针(就是被shared_ptr所管理的指针) 。 但是不建议使用get()函数获取 shared_ptr 关联的原始指针,因为如果在 shared...
void swap(shared_ptr<T>& b); 这可以很方便地交换两个shared_ptr。swap函数交换保存的指针(以及它们的引用计数)。这个函数不会抛出异常。 template <typename T,typename U> shared_ptr<T> static_pointer_cast(const shared_ptr<U>& r); 要对保存在shared_ptr里的指针执行static_cast,我们可以取出指针...
T &operator*()const;// 操作符重载T &operator->()const;// 操作符重载T *get()const;// 获得原始指针boolunique()const;// 是否唯一longuse_count()const;// 引用计数explicitoperatorbool()const;// 显式bool型转换voidswap(shared_ptr & b);// 交换指针}; ...
// I am unsure if I will eventually need shared ownership or not std::unique_ptr<Node> _ptr; }; Example* example = new Example(); // Some function somewhere void f() { // I've decided I need shared ownership, converting std::shared_ptr<Node> ptr(std::move(example->getPtr())...
智能指针重载了->操作符,当调用智能指针的->时,内部会转换为真正的数据指针的解引用;所以智能指针使用起来,和使用普通指针基本一致。 C++11的定义了多种智能指针,他们都包含在#include <memory>头文件中 shared_ptr的用法 从名字上看shared_ptr是共享指针,意味着我们可以复制shared_ptr,复制出的智能指针指向同一个...
托管指针类型的对象。U* 应隐式转换为 T*(其中 T 是 shared_ptr 的模板参数)。 用法举例: #include <iostream> #include <memory> int main () { std::shared_ptr<int> foo; std::shared_ptr<int> bar (new int(10)); foo = bar; // copy bar = std::make_shared<int> (20); // move ...