如何将真正不可变的 2D 数组传递给函数?

How do I pass a truly immutable 2D array to a function?

本文关键字:数组 函数 2D 不可变      更新时间:2023-10-16

我有这个功能:

void foo(const double *const *matrix, unsigned num_rows, unsigned num_columns){
//matrix[0][0] = 5; // ERROR: expression must be a modifiable lvalue
for (unsigned i = 0; i < num_rows; i++) delete matrix[i];
delete matrix;
}

。其中,该函数不能更改矩阵中任何给定索引的值,但它仍然能够删除矩阵或其任何行。有没有办法传入 2D 矩阵并保证它不会以任何方式被更改?

编辑:看起来没有办法做到这一点,所以我可能会切换到使用向量。

No.

delete可以在指针上调用,即使它作为const &传递,甚至声明为const,因为指针不会被更改。

也没有办法阻止某人这样做

unsigned char *p = (unsigned char *)your_precious_data_pointer;
*p = 42;

克服它。

Const正确性旨在检测意外错误,而不是防止程序员的故意行为。这与安全性无关。

甚至可以争论它是否是防止意外错误的好工具。

No.但是无论如何,您都不应该使用newdelete和原始的拥有指针,当然也不应该delete任意指针。

如果这还不足以切换到智能指针和容器......您实际上是通过delete明显分配了new[]的东西来触发未定义的行为。这是原始拥有指针需要注意的另一个错误。

附带说明一下,这不是一个 2D 数组,而是一个指针数组。