Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.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++ 智能ptr到SEGFULT类的属性_C++_C++11_Segmentation Fault_Smart Pointers - Fatal编程技术网

C++ 智能ptr到SEGFULT类的属性

C++ 智能ptr到SEGFULT类的属性,c++,c++11,segmentation-fault,smart-pointers,C++,C++11,Segmentation Fault,Smart Pointers,我想知道这个示例是否会导致segfault,因为对象的dtor被称为I,我仍然持有对象属性的共享\u ptr struct foo{ std::shared_ptr<std::string> const bar = std::make_shared<std::string>("foo"); foo() {std::cout << "CTOR!" << std::endl;} ~foo(){std::cout <&

我想知道这个示例是否会导致segfault,因为对象的dtor被称为I,我仍然持有对象属性的共享\u ptr

struct foo{
    std::shared_ptr<std::string> const bar = std::make_shared<std::string>("foo");

    foo() {std::cout << "CTOR!" << std::endl;} 

    ~foo(){std::cout << "DTOR!" << std::endl;}
};
int main() {
    std::shared_ptr<std::string> ptr;
    {
        std::shared_ptr<foo> foo_ptr = std::make_shared<foo>();
        ptr = foo_ptr->bar;
    }
    std::cout << *ptr << std::endl;


    return 0;
}
structfoo{
std::shared_ptr const bar=std::make_shared(“foo”);

foo(){std::cout不,它不会。通过将std::shared_ptr
分配给另一个,你就是在拒绝它死亡

此操作
ptr=foo\u ptr->bar;
将使共享指针的计数器增加一个。这将保证空闲存储上动态分配的对象仍然有效

即使是被摧毁对象的属性也是如此吗?!

是的,这是真的。在非正式的谈话中,动态分配内存的一个用途是当你希望你的对象比它的所有者(另一个对象,指针…)活得更多时。因此,在容器对象死后,该对象将活得更好


尝试执行此代码。它会让您明白:

std::shared_ptr<std::string> ptr;
{
    std::shared_ptr<foo> foo_ptr = std::make_shared<foo>();
    std::cout <<"References Count:" << foo_ptr->bar.use_count()<<"\n";
    ptr = foo_ptr->bar;
    std::cout <<"References Count:" << foo_ptr->bar.use_count()<<"\n";
}
std::cout <<"References Count:" << ptr.use_count()<<"\n";
std::cout << *ptr << std::endl;

这里没有问题。
std::shared\u ptr
就是为了做到这一点而设计的。如果我们看看代码是如何工作的,你会发现这一点

std::shared_ptr<std::string> ptr;
现在,我们创建名为
foo\u ptr
shared\u ptr
,它指向
foo
的一个有效实例,并且
foo
的构造函数初始化
bar
。然后我们将
bar
分配给
ptr
。当我们这样做时,
bar
的内部引用计数器增加一(到二)现在
bar
ptr
共享内部指针。然后我们到达作用域的末尾,
foo\u ptr
被销毁,当它被销毁时,它调用
foo
的析构函数,该析构函数调用
bar
的析构函数。当
bar
被销毁时,它放弃对指针的访问。这意味着它递减参考计数器。如果它是最后一个
共享的\u ptr
(输入析构函数时计数器为1),则指针也会被删除,如果不是,则它不会执行任何其他操作。因为计数器不止一个(由于
ptr=foo\u ptr->bar
,所以计数器为2)指针不会被删除,但会保留在
ptr
中,因为所有权是共享的


std::cout那么该对象将被销毁,但该属性仍处于活动状态?刚才我认为它是指向该对象的指针,而不是指向其属性..我不确定让我check@Exagon,是的。没错。这就是共享ptr的目的。是的,它仍然是一个活的,我会编辑来解释more@Exagon:需要澄清的是:属性
ba在
foo\u ptr
超出范围后,r
将不会处于活动状态,但
ptr
不会指向
bar
。相反,它指向
bar
指向的任何对象,并且该对象保证仍然处于活动状态。使用共享指针管理
foo
对象只是噪音,与您的内核无关例如,您可以将其创建为堆栈上的本地对象。
std::shared_ptr<std::string> ptr;
{
    std::shared_ptr<foo> foo_ptr = std::make_shared<foo>();
    ptr = foo_ptr->bar;
}
std::cout << *ptr << std::endl;