很可能我正在尝试做的是糟糕的练习。如果是这样,请告诉我,这样我就可以停下来。无论如何,我正在研究一些使用动态内存存储矩阵数据数组的基本矩阵数学函数。我试图弄清楚如何将传递给构造函数的 vector 转换为该数组,但我得到了一些奇怪的结果。这是简单的版本。
标题:
class Matrix {
public:
unsigned int size = 4;
float *M;
Matrix(std::vector<float> values) : M(&values[0]){}
~Matrix() = default;
};
和测试文件:
int main(){
Matrix m(std::vector<float>{ 0.0f, 0.0f, 0.0f, 1.0f,
1.0f, 2.0f, 3.0f, 4.0f,
5.0f, 6.0f, 7.0f, 8.0f,
9.0f, 10.0f, 11.0f, 12.0f });
return 0;
}
结果是……错误的。一切似乎都有效(从调试时观察值)直到从构造函数返回。我的猜测是 Visual Studio 的调试器在骗我,而且它发生的时间比那早。
所以除了大小没有改变之外,还有什么事发生?有一个更好的方法吗?此外,是否可以接受 std::initializer_list 并将该数据提供给动态指针?
最佳答案
您传入的 vector 是一个临时对象。一旦构造函数完成,临时 vector 将不复存在,因此您存储的地址 (&values[0]
) 将因此指向垃圾。您的代码实际上可能有效,但它实际上也可能使您的计算机崩溃,或者给您泡咖啡,或者做任何其他未定义的事情。
如果你想保持相同的接口(interface)(即传入一个 vector ),你需要将数据复制出来。这样的事情会让你开始
Matrix(std::vector<float> values) : M(new float[values.size()])
{
std::copy(values.begin(), values.end(), M);
}
但现在您必须在析构函数中释放 M,并实现适当的复制构造函数和赋值运算符。也不要忘记您的移动构造函数和赋值运算符;)查看 std::unique_ptr
和 std::shared_ptr
(当然还有 std::vector
) 以获得更好的内存管理方式。
关于c++ - 使用 vector 构造函数分配动态内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33790795/