4

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

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

如果您正在使用可执行映像中的常量数据,如果您可以向 foo 提供该保证,并且如果 foo 需要保留对该数据的引用超过函数调用的持续时间,则 foo 可以简单地保留指针,而不必复制数据。

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

谢谢。

4

4 回答 4

3

不是使用原始指针,但您可以使用 shared_ptr 或 unique_ptr 来代替它来传达函数拥有指针的所有权。

于 2012-09-03T19:29:24.520 回答
3

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

A: 不。你总是有能力射自己的脚 :)

于 2012-09-03T19:24:09.033 回答
1

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

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

于 2012-09-03T19:28:41.547 回答
1

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

所以不,没有直接的语言特征,但引入语义很容易。

下面是一个关于如何防止客户端意外将标准数据提升到不朽数据容器的说明:

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 */ ;
};

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

于 2012-09-03T19:28:49.767 回答