簡體   English   中英

shared_ptr 的未知行為

[英]Unknown behavior with shared_ptr

我有一個示例代碼如下

#include <iostream>
#include <memory>

using namespace std;

class A {
    public:
    int n = 0;
};

class B {
    public:
    shared_ptr<A> ba;
};

class C {
    public:
    shared_ptr<A> ca;
    shared_ptr<B> cb;
};

int main () {
    cout << "Hello\n";

    C c;
    shared_ptr<A> a(new A);

    c.ca = a;
    c.cb->ba = a; // MAYBE PROBLEM HERE

    return 0;
}

這段代碼編譯成功,但是當我運行時,它甚至不打印“Hello”。 我是 C++ 和智能指針的新手。 請幫我解釋這里的問題。 提前致謝!

您的代碼的可能修復:

#include <iostream>
#include <memory>

using namespace std;

class A {
    public:
    int n = 0;
};

class B {
    public:
    shared_ptr<A> ba;
};

class C {
    public:
        C() {
            cb = make_shared<B>();
        }
    shared_ptr<A> ca;
    shared_ptr<B> cb;
};

int main () {
    cout << "Hello\n";

    C c;
    shared_ptr<A> a = make_shared<A>();

    c.ca = a;
    c.cb->ba = a; // PROBLEM FIXED in constructor

    return 0;
}

這是未定義的行為。 您永遠不會創建 B 的實例,並且在行c.cb->ba = a; // MAYBE PROBLEM HERE c.cb->ba = a; // MAYBE PROBLEM HERE存在問題,您正在取消引用 null 指針,即 UB。

請注意,共享指針默認構造為 nullptr,而不是擁有類型的默認構造函數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM