为什么alloca两次返回相同的地址?
我正在尝试实现我自己的数学库,并且我从向量开始。这个想法是给类一个指向数字数组的指针,然后复制该数组并将其存储在私有变量指针给出的数据地址中。首先,我曾经alloca尝试为私有变量释放一些内存
虚拟机
namespace vml {
// Vectors
template <typename in_type, const int in_length>
class vec {
public:
vec(in_type* in_data) {
std::cout << data << std::endl;
std::copy(in_data, in_data + in_length, data);
}
vec() {
data = nullptr;
}
in_type& operator()(int index) const {
_ASSERT(0 <= index && index < in_length);
return data[index];
}
private:
in_type* data = alloca(in_length * sizeof(in_type));
};
主程序
int main() {
int list[] = { 1,2,3 };
int list2[] = {2,4,6 };
vml::vec<int, 3> a(list);
vml::vec<int, 3> b(list);
return 0;
}
这不会产生错误,但是由于某种原因,alloca在调用两个实例时两次返回相同的地址。我到处搜索,但找不到原因的解释。所以我决定使用数组分配内存。如果你能回答这个问题,那将是非常有帮助的。谢谢。
回答
你必须非常小心alloca。它在堆栈而不是堆上分配内存。一旦调用的函数alloca退出,该内存就会被释放。在这种情况下,它将在构造函数中调用operator(),因此当您调用该内存时,该内存已被释放并且您正在处理未定义的行为。
除非您真的需要避免堆分配,并且您确定不会溢出堆栈并且您了解使用的所有限制alloca,否则最好避开它。