Что происходит, когда я пытаюсь запустить функцию constexpr внутри функции не constexpr? - PullRequest
0 голосов
/ 03 марта 2019

Название может вводить в заблуждение, не знаю, как это объяснить, но я приведу пример.

Итак, у меня есть такие структуры:

struct mom {
public:
    static constexpr auto create(int i) {
        return a(i);
    }

    struct a {
        int* m_a;

        constexpr a(int i) : m_a(&i) {
            change();
        }

        constexpr void change(void) {
            *m_a += 100;
        }

        struct b {
        public:
            static int get(a* import) {
                int* arr = new int[10];
                arr[1] = *import->m_a;

                return arr[1];
            }
        };
    };
};

И я называю это так:

printf("%d", mom::a::b::get(&(mom::create(10))));

Предполагается добавить 100 10 (или любое другое значение, которое вы ему дадите) во время компиляции, а затем во время выполнения, чтобы сохранить его в динамическом массиве и вернуть вам.

Этот код почти точен для моего проекта, но у него есть проблема: вместо добавления 100 к значению он возвращает случайное большое число (-95321314).Я попытался отладить его, и все нормально, пока я не вызову функцию get (), в которой я понятия не имею, что происходит, что вызывает

какие-либо идеи?

1 Ответ

0 голосов
/ 03 марта 2019

Проблема в том, что m_a является указателем на временный объект, так как вскоре стек раскручивается, дальнейшее использование этого временного элемента не определено.

В частности, вызов mom::create(10) возвращает структуру a,чей член m_a больше не указывает на допустимую область памяти.Последующее использование этого члена будет неопределенным (например, копирование в массив b в get())


Простое «исправление» - изменить m_a(&i) -> m_a(new int(i))Обратите внимание, что это приводит к утечке памяти и полностью меняет структуру памяти.Поскольку мне не ясно, каковы ваши цели в области дизайна, это разумная альтернатива, чтобы все "работало".

...