ошибка сегментации при доступе к константной функции из внутреннего класса - PullRequest
1 голос
/ 24 апреля 2019

Невозможно понять, почему возникает ошибка сегментации при доступе к элементам const из внутреннего класса.

Программа:

#include <iostream>
#include <string>
#include <unordered_map>

using namespace std;

typedef struct
{
    double a;
    double b;
} conf;

class configuration
{
   public:
    configuration(const conf *conf) : conf_(conf) {}
    double
    getA() const
    {
        return conf_->a;
    }
    double
    getB() const
    {
        return conf_->b;
    }

   private:
    const conf *conf_;
};

class Test
{
   private:
    class TestInner
    {
       public:
        TestInner(const configuration *conf) : conf_(conf) {}

        void
        print()
        {
            cout << "INNER START\n";
            cout << "Innerclass data: a : " << conf_->getA()
                 << "b : " << conf_->getB() << "\n";
            cout << "INNER END\n";
        }

       private:
        const configuration *conf_;
    };

   private:
    const configuration *conf_;
    typedef std::unordered_map<std::string, TestInner *> TestInners;
    TestInners testInners_;
    const std::string key_;

   public:
    Test(const configuration *conf);
    void
    print();
};

Test::Test(const configuration *conf) : conf_(conf), key_("ABC")
{
    TestInner testInner_(conf);

    testInners_.insert(std::pair<std::string, TestInner *>(key_, &testInner_));
}

void
Test::print()
{
    cout << "Test data: a : " << conf_->getA() << "b : " << conf_->getB()
         << "\n";

    TestInners::const_iterator testInner = testInners_.find(key_);
    testInner->second->print();
}

int
main()
{
    conf conf_;
    conf_.a = 10;
    conf_.b = 10;

    configuration configuration_(&conf_);
    Test test(&configuration_);

    test.print();

    cout << "Hello World";

    return 0;
}

Вывод:

Тестовые данные: a:10b: 10
INNER START
Ошибка сегментации (ядро сброшено)

Кажется, это зависит от компилятора,

1.On g ++ (GCC) 4.4.6 20110731 (Red Hat 4.4.6-3)

Output: 

Test data: a : 10b : 10
INNER START
Innerclass data: a : 3.15654e-317b : 6.95271e-310
INNER END
Hello World%   

2.На Apple LLVM версия 9.0.0 (clang-900.0.39.2)

Output:

Test data: a : 10b : 10
INNER START
Innerclass data: a : 10b : 10
INNER END
Hello World
ошибка сегментации в x86_64-pc-linux-gnu-g ++ (GCC) 7.4.0

1 Ответ

1 голос
/ 24 апреля 2019

Получение адреса переменной в стеке и использование значения после выхода из метода приводит к неопределенному поведению.Перемещение значения в кучу устранит проблему, но, вероятно, потребует более поздней очистки в dtor of Test

Test::Test(const configuration *conf) : conf_(conf), key_("ABC")
{
    TestInner testInner_* = new TestInner(conf);

    testInners_.insert(std::pair<std::string, TestInner *>(key_, testInner_));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...