有没有一种方法可以在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)。
然而,在foo(void const*bar)的情况下,这只是向调用方保证foo不会试图修改bar指向的数据。它并不能保证bar指向的内存位置始终有效。
在处理可执行映像中的常量数据的情况下,如果您可以向foo提供这种保证,并且如果foo需要在函数调用的持续时间之外保留对该数据的引用,那么foo可以简单地保留指针的副本,而不必制作数据的副本。
有没有一种方法可以在C++类型的系统中对这种保证进行编码?
谢谢。
Q:有没有一种方法可以在C++中指定指针指向始终有效的数据?
A: 不。你总是有能力射中自己的脚:)
不使用原始指针,但您可以使用shared_ptr或unique_ptr来表示函数拥有指针的所有权。
如果接受指针作为输入,就没有真正的方法来保证它。然而,您可以维护一个有效指针表,并让您的输入成为该表的索引;您可以通过确保索引位于表中来验证这一点。
除此之外,您所能做的最好的事情就是捕获使用坏指针时发生的异常/信号,并尝试从中恢复
我采用的方法是创建一个类表示,它引入了一个语义,指定支持数据为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 */ ;
};
然后更新程序以接受此类型作为参数,并相应地处理这些情况。
相关文章:
- 将常量指针引用绑定到非常量指针
- 运行时错误:引用绑定到类型为"int"的空指针
- 创建一个函数的 Python 绑定,返回指向带有 boost 的向量的指针
- 与简单地创建派生类指针相比,将基类绑定到派生类有什么优点?
- 获取具有静态局部变量的绑定/推断捕获 lambda 的函数指针
- 努力将指向成员函数的指针绑定到类模板的T成员,然后在槽中调用
- 将引用绑定到指针的语法是什么?(各种)
- 为什么 VS 无法将右值引用绑定到指针?
- 使用 python 绑定来检查 C++ 类型是否是规范方式的指针、引用等?
- 函数参数绑定通过参考与传递指针传递数组的规则
- 排序时引用绑定到 'value_type' 类型的 null 指针
- PyBind11:绑定使用双指针的函数
- C++绑定函数到指针
- 如何破坏包含自指指针的对象
- const自动参考绑定到(NULL)指针 - 实际类型是什么
- 如何将函数指针传递给绑定
- 指向成员的指针如何知道它绑定了哪个成员
- Swig - 绑定返回对控制器类指针的引用的方法
- RValue 引用在将其绑定(非指针)对象分配给另一个指针后是否会删除该对象?
- 指您不拥有的"std::unique_ptr"(使用原始指针?