关于const:有没有办法在C ++中指定指针指向始终有效的数据?

Is there a way to specify in C++ that a pointer points to data that is always valid?

在指针(foo(void*bar))的函数参数中,可以使用const指定指针(参数)本身为常量(foo(void*const bar))和/或指针指向的数据为常量(foo(void const*bar))。

然而,在foo(void const*bar)的情况下,这只是向调用者保证foo不会尝试修改bar指向的数据。它并不保证BAR向FOO提供BAR指向的内存位置始终有效的任何保证。

在使用可执行映像中的常量数据的情况下,如果可以向foo提供保证,并且如果foo需要将该数据的引用保留的时间长于函数调用的持续时间,则foo可以简单地保留指针的副本,而不必复制数据。

有没有办法在C++类型系统中对这个保证进行编码?

谢谢。


问:有没有一种方法可以在C++中指定指针指向总是有效的数据?

答:不,你总是有能力用脚射自己:)


不是使用原始指针,但您可以使用共享指针或唯一指针,这将表示函数拥有指针的所有权。


我采用的方法是创建一个类表示,它引入一个指定支持数据为static的语义。然后,只需确保它不能被琐碎的构造,或者它的数据被重新分配。

所以,没有直接的语言特性,但是引入语义就足够简单了。

下面是如何防止客户端意外地将标准数据提升为不朽的数据容器的说明:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
template <typename T>
class t_immortal_data_container {
public:
  // how clients create t_immortal_data_container<T>,
  // avoiding implicit promotions:
  static t_immortal_data_container Create(T& pImmortalData) {
    return t_immortal_data_container(pImmortalData);
  }

  ~t_immortal_data_container() {
  }
public:
  ...
private:
  // private: ensure t_immortal_data_container<T> only can use
  // this constructor:
  t_immortal_data_container(T& pData) : d_immortalData(pData) {
  }
private:
  T d_immortalData; /* << as pointer or reference */
private:
  // prohibited -- no definition
  t_immortal_data_container() /* = delete */ ;
};

然后更新程序以接受此类型作为参数,并相应地处理这些情况。


如果接受一个指针作为输入,就没有真正的方法来保证它。但是,您可以维护一个包含有效指针的表,并让您的输入成为该表的索引;您可以通过确保索引位于该表中来验证这一点。

除此之外,您所能做的最好的就是捕获在使用错误指针时发生的异常/信号,并尝试从中恢复。