当我尝试在非constexpr函数中运行constexpr函数时会发生什么?

问题描述 投票:0回答:1

标题可能会产生误导,不知道如何解释这一点,但我会提供一个例子。

所以我有这样的结构:

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(或你给它的任何其他值)100,然后在运行时将它存储到动态数组并返回给你。

这段代码几乎与我的项目完全相同,但它有一个问题:它不是向值中添加100,而是返回一个随机的大数字(-95321314)。我试过调试它,直到我调用get()函数都没关系,我不知道发生了什么导致这个

有任何想法吗?

c++ constexpr compile-time
1个回答
1
投票

问题是m_a是指向临时的指针,一旦堆栈展开,该临时的进一步使用是未定义的。

具体来说,对mom::create(10)的调用返回一个结构a,其成员m_a不再指向有效的内存区域。该成员的后续使用将是未定义的(例如,复制到b中的get()数组中)


一个简单的“修复”是改变m_a(&i) - > m_a(new int(i)),虽然注意这会引入内存泄漏并完全改变内存布局。由于我不清楚你的设计目标是什么,所以它是让事情“有效”的合理选择。

© www.soinside.com 2019 - 2024. All rights reserved.