Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 什么';原始指针和弱指针的区别是什么?_C++_Weak Ptr_Raw Pointer - Fatal编程技术网

C++ 什么';原始指针和弱指针的区别是什么?

C++ 什么';原始指针和弱指针的区别是什么?,c++,weak-ptr,raw-pointer,C++,Weak Ptr,Raw Pointer,如标题所示。这个问题可能已经有了答案,但我没有找到答案。原始指针(至少在正常情况下)只是一个地址。从指针本身看不出它指向什么 弱\u ptr总是与共享\u ptr相关联,因此我们可能需要从共享\u ptr开始来理解弱\u ptr shared\u ptr是引用计数的,因此它跟踪存在多少指向对象的引用(指针),并在不再存在指向该对象的引用时自动销毁该对象 正如我已经说过的,弱的ptr与共享的ptr相关联。与共享\u ptr不同,弱\u ptr的存在不会增加指针对象的引用计数。要使用弱\u ptr,

如标题所示。这个问题可能已经有了答案,但我没有找到答案。

原始指针(至少在正常情况下)只是一个地址。从指针本身看不出它指向什么

弱\u ptr
总是与
共享\u ptr
相关联,因此我们可能需要从
共享\u ptr
开始来理解
弱\u ptr

shared\u ptr
是引用计数的,因此它跟踪存在多少指向对象的引用(指针),并在不再存在指向该对象的引用时自动销毁该对象

正如我已经说过的,
弱的ptr
共享的ptr
相关联。与
共享\u ptr
不同,
弱\u ptr
的存在不会增加指针对象的引用计数。要使用
弱\u ptr
,必须首先将其转换为
共享\u ptr
。如果当前引用计数为正,则将成功,并且将
弱\u ptr
转换为
共享\u ptr
将增加引用计数,以表示转换的指针是对对象的“真实”引用。另一方面,如果引用计数已经为零(意味着指针对象已经被销毁),则将
弱\u ptr
转换为
共享\u ptr
的尝试将失败

shared\u ptr
表示指针对象的共享所有权。只要指向该对象的至少一个共享ptr存在,指针对象将保持存在,但一旦最后一个指向该对象的
共享ptr
被销毁,指针对象也将保持存在


弱\u ptr
表示对指针对象的非所有权访问。如果对象存在,它允许访问。如果对象已被销毁,它会告诉您指针对象不再存在,而不是试图访问已销毁的对象。

裸指针和
弱\u ptr
的基本概念区别在于,如果指向的对象被销毁,裸指针不会告诉您。这称为悬挂指针:指向不存在的对象的指针。通常很难找到它们

将显示
弱\u ptr
。要使用
弱\u ptr
,必须首先将其转换为
共享\u ptr
。如果该
shared\u ptr
没有指向任何内容,则该对象已被删除

例如:

#include <iostream>
#include <memory>

std::weak_ptr<int> wp;

void test()
{
    auto spt = wp.lock(); // Has to be copied into a shared_ptr before usage
    if (spt) {
        std::cout << *spt << "\n";
    } else {
        std::cout << "wp is expired\n";
    }
}

int main()
{
    {
        auto sp = std::make_shared<int>(42);
        wp = sp;
        test();
    }
    test();
}

您可以检查弱ptr是否指向有效的内容。你不能用一个原始的指针来做这件事。如果你自己看看并看到所有的差异,可能会更好。没有一个单一的区别,有很多。
42
wp is expired