c++ - 使用 vector 构造函数分配动态内存

标签 c++ pointers dynamic vector constructor

很可能我正在尝试做的是糟糕的练习。如果是这样,请告诉我,这样我就可以停下来。无论如何,我正在研究一些使用动态内存存储矩阵数据数组的基本矩阵数学函数。我试图弄清楚如何将传递给构造函数的 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_ptrstd::shared_ptr(当然还有 std::vector ) 以获得更好的内存管理方式。

关于c++ - 使用 vector 构造函数分配动态内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33790795/

相关文章:

jquery - 制作一个响应用户输入的动态棋盘 jQuery

image - BIRT动态图像报告生成

c++ - 在 Delphi 6 中使用 C++ DLL

c++ - 是否可以在 C++ 中覆盖此虚拟方法?

c - C 中作为函数参数的指针为 NULL

C++,缓存局部性改进的基准测试方法?

c++ - 限制整数模板参数

c++ - 在 MessageBox 上单击“否”后使程序自动关闭(C++)

c - strcmp 导致段错误

javascript - 我如何使用ajax发送动态值