如何将真正不可变的 2D 数组传递给函数?
How do I pass a truly immutable 2D array to a function?
我有这个功能:
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.但是无论如何,您都不应该使用new
,delete
和原始的拥有指针,当然也不应该delete
任意指针。
如果这还不足以切换到智能指针和容器......您实际上是通过delete
明显分配了new[]
的东西来触发未定义的行为。这是原始拥有指针需要注意的另一个错误。
附带说明一下,这不是一个 2D 数组,而是一个指针数组。
相关文章:
- C++中的高效循环缓冲区,它将被传递给C样式数组函数参数
- 打印 2D 动态数组 c++ 函数
- C++数组函数
- 在数组函数指针中调用void
- 数组函数似乎没有找到最大值
- 使用数组函数和循环求解伪元编码|C
- 在头文件中的函数原型中获取指针数组:函数声明为 void
- 数组函数错误输出
- 读取文件,然后创建数组函数C++
- 指针数组函数参数-奇怪的行为
- 二维数组 - 函数
- "return"没有从数组函数返回正确的值
- 数组函数问题
- 数组函数的大小返回 int 的大小而不是数组
- 从数组函数中删除元素
- 如何从C++中最好地调用具有C99风格数组函数签名的函数
- 追加/打印/插入数组c++函数问题
- 如何将数组函数转换为指针函数
- 多维数组函数输出垃圾
- C++:数组函数的递归最大值