标题可能会引起误解,不确定如何解释,但我将提供一个示例。
所以我有这个结构:
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()函数为止一切都很好,在该函数中我不知道发生了什么事情导致此问题
有什么想法吗?
答案 0 :(得分:1)
问题是m_a
是指向临时变量的指针,一旦堆栈释放该临时变量的进一步使用是不确定的。
具体来说,对mom::create(10)
的调用返回一个结构a
,其成员m_a
不再指向内存的有效区域。该成员的后续用法将是不确定的(例如,复制到b
中get()
数组中的副本)
一个简单的“解决方案”是更改m_a(&i)
-> m_a(new int(i))
,尽管请注意,这会导致内存泄漏并完全更改内存布局。由于我不清楚您的设计目标是什么,因此它是使工作“正常”的合理选择。