标题可能会产生误导,不知道如何解释这一点,但我会提供一个例子。
所以我有这样的结构:
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()函数都没关系,我不知道发生了什么导致这个
有任何想法吗?
问题是m_a
是指向临时的指针,一旦堆栈展开,该临时的进一步使用是未定义的。
具体来说,对mom::create(10)
的调用返回一个结构a
,其成员m_a
不再指向有效的内存区域。该成员的后续使用将是未定义的(例如,复制到b
中的get()
数组中)
一个简单的“修复”是改变m_a(&i)
- > m_a(new int(i))
,虽然注意这会引入内存泄漏并完全改变内存布局。由于我不清楚你的设计目标是什么,所以它是让事情“有效”的合理选择。