不拥有任何指针的shared_ptr称为空shared_ptr。不指向任何对象的shared_ptr称为 null shared_ptr,不应取消引用。请注意,空shared_ptr不一定是 null shared_ptr,null shared_ptr不一定是空shared_ptr。 shared_ptr对象通过运算符 * 和 -> 提供对它们所指向的对象的访问,从而复制有限的指针功能。出于安全原因,它们...
int* ptr = nullptr;//使用 nullptr 初始化指针 2. 检查指针是否为空 在解引用指针之前,总是检查它是否为空。 if(ptr !=nullptr) {//现在可以安全地使用 ptr} 3. 使用智能指针 C++11 引入了智能指针,如std::unique_ptr和std::shared_ptr,它们可以自动管理内存,并在尝试解引用空指针时提供更安全的操作。
shared_ptr可以协调对象的析构,但这仅限于其自身的拷贝(也是shared_ptr)之间。 // 在函数被调用时ptr被创建并初始化 void process(shared_ptr<int> ptr) { // 使用ptr } // ptr离开作用域,被销毁 int main() { shared_ptr<int> p(new int(42)); // 引用计数为1 process(p); // 拷贝p会递增它...
weak_ptr 是 shared_ptr 的观察员。它不会干扰shared_ptr所共享的所有权。当一个被weak_ptr所观察的 shared_ptr 要释放它的资源时,它会把相关的 weak_ptr的指针设为空。这防止了 weak_ptr 持有悬空的指针。 这是C++中的概念,在C中,子对象持有父对象的weak_ptr,相当于持有父指针的地址,即指向父指针的指针。
当我们对智能指针进行赋值时,如ptest2 = ptest,ptest2会接管ptest原来的内存管理权,ptest会变为空指针,如果ptest2原来不为空,则它会释放原来的资源,基于这个原因,应该避免把auto_ptr放到容器中,因为算法对容器操作时,很难避免STL内部对容器实现了赋值传递操作,这样会使容器中很多元素被置为NULL。判断一个智能指针...
1) 通过如下 2 种方式,可以构造出 shared_ptr 类型的空智能指针: 注意,空的 shared_ptr 指针,其初始引用计数为 0,而不是 1。 2) 在构建 shared_ptr 智能指针,也可以明确其指向。例如: 由此,我们就成功构建了一个 shared_ptr 智能指针,其指向一块存有 10 这个 int 类型数据的堆内存空间。
shared_ptr采用引用计数的方式管理所指向的对象。当有一个新的shared_ptr指向同一个对象时(复制shared_ptr等),引用计数加1。当shared_ptr离开作用域时,引用计数减1。当引用计数为0时,释放所管理的内存。 这样做的好处在于解放了程序员手动释放内存的压力。之前,为了处理程序中的异常情况,往往需要将指针手动封装到类...
std::shared_ptr<Object> p1 = std::make_shared<Object>("foo");std::shared_ptr<Object> p2(new Object("foo"));许多google和stackoverflow帖子就在这里,但我无法理解为什么make_shared比直接使用更有效shared_ptr。有人可以一步一
关于shared_ptr的说法,错误的是:A.使用make_shared代替new生成shared_ptrB.同一个对象的指针,可以shared_ptr和原生指针混用。C
(1)使用空参数构造函数构造 std::shared_ptr<T> ptr; 这样构造的话,ptr 的意义就相当于一个 NULL 指针。当试图在一个空指针上做类似于 *ptr 或者 ptr->xx 之类的东西的时候,会出现异常错误 (2)直接从 new 操作符的返回值构造 std::shared_ptr<T> ptr(new T()); //引用计数加 1 ...