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

时间:2019-03-03 14:00:38

标签: c++ constexpr compile-time

标题可能会引起误解,不确定如何解释,但我将提供一个示例。

所以我有这个结构:

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))));

应该在编译时将10(或您给它的任何其他值)加上100,然后在运行时将其存储到动态数组中并返回给您。

这段代码几乎与我的项目完全一样,但是有一个问题:它没有向值加100,而是返回一个随机的大数字(-95321314)。我尝试调试它,直到我调用get()函数为止一切都很好,在该函数中我不知道发生了什么事情导致此问题

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

问题是m_a是指向临时变量的指针,一旦堆栈释放该临时变量的进一步使用是不确定的。

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


一个简单的“解决方案”是更改m_a(&i)-> m_a(new int(i)),尽管请注意,这会导致内存泄漏并完全更改内存布局。由于我不清楚您的设计目标是什么,因此它是使工作“正常”的合理选择。