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

时间:2012-09-03 19:21:41

标签: c++ const

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

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

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

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

感谢。

4 个答案:

答案 0 :(得分:4)

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

答:不会。你总是有能力用脚射击自己:)

答案 1 :(得分:3)

不使用原始指针,但您可以使用shared_ptr或unique_ptr来表示该函数拥有指针的所有权。

答案 2 :(得分:1)

如果您接受指针作为输入,则无法保证它。但是,您可以维护一个有效指针表,并让您的输入成为该表的索引;您可以通过确保索引属于表格来验证。

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

答案 3 :(得分: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 */ ;
};

然后您更新程序以接受此类型作为参数,并相应地处理案例。