我有这个功能:
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矩阵并保证不会以任何方式改变它?
编辑:看起来没有办法做到这一点,所以我可能会转而使用向量。
答案 0 :(得分:1)
没有
delete
可以在指针上调用,即使它作为const &
传递或甚至声明为const
,因为指针不会被更改。
也无法阻止某人做
unsigned char *p = (unsigned char *)your_precious_data_pointer;
*p = 42;
克服它。
Const正确性旨在检测意外错误,而不是用于阻止程序员的故意行为。这与安全无关。
如果它是防止意外错误的好工具,甚至可以辩论。
答案 1 :(得分:0)
没有。但是你不应该使用new
,delete
和原始拥有指针,当然不是delete
任意指针。
如果这还不足以切换到智能指针和容器......您实际上是通过delete
明显分配了new[]
的内容来触发未定义的行为。用原始拥有的指针来注意另一个错误。
另一方面,这不是2D数组,而是指针数组。