Неизвестное поведение с shared_ptr - PullRequest
0 голосов
/ 09 апреля 2020

У меня есть пример кода, как показано ниже

#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». Я новичок ie в C ++, а также умный указатель. Пожалуйста, помогите мне объяснить проблему здесь. Заранее спасибо!

Ответы [ 2 ]

1 голос
/ 09 апреля 2020

Возможное исправление для вашего кода:

#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;
}
0 голосов
/ 09 апреля 2020

Это неопределенное поведение. Вы никогда не создаете экземпляр B, а в строке c.cb->ba = a; // MAYBE PROBLEM HERE вы отменяете ссылку на нулевой указатель, который является UB.

Обратите внимание, что совместно используемые указатели по умолчанию создаются как nullptr, а не как конструктор по умолчанию для принадлежащего типа.

...