我可以在不调用未定义行为的情况下存储指向不存在数据的指针吗?
Can I store a pointer to non-existing data without invoking undefined behavior?
我有一个指针,前段时间指向活着的对象,但现在这个对象已经死了。是真的吗,如果我不使用这个死对象(不取消引用指针,不使用方法等),就没有未定义的行为吗?
代码示例:
int* x = new int;
int* y = x;
delete x;
// From now on never use *y, or y->... or something else
// that will "dereference" y.
是的,您的代码中没有未定义的行为。你得到的是两个 悬挂指针 ,即 x
和 y
。如果您不取消引用它们(或再次释放它们),它们就完全没问题,但它们代表了 C 风格代码中的主要错误来源。
绝对没问题。一个更简单、更熟悉的案例是
int* x = new int;
delete x;
取消引用 x
的行为未定义,一些程序员会写 delete x; x = nullptr;
来强调这一点。
确认@BoPersson,阅读 delete
之后的 x
充其量是实现定义的,并且可能包含针对无效地址的硬件陷阱。参见 Is it legal to compare dangling pointers?
如果你想防止这种情况发生,你可以使用
std::shared_ptr
std::weak_ptr
但是如果你想在你的程序中创建这个场景,你能说出为什么吗?通常我们假设程序总是处于良好状态
我有一个指针,前段时间指向活着的对象,但现在这个对象已经死了。是真的吗,如果我不使用这个死对象(不取消引用指针,不使用方法等),就没有未定义的行为吗?
代码示例:
int* x = new int;
int* y = x;
delete x;
// From now on never use *y, or y->... or something else
// that will "dereference" y.
是的,您的代码中没有未定义的行为。你得到的是两个 悬挂指针 ,即 x
和 y
。如果您不取消引用它们(或再次释放它们),它们就完全没问题,但它们代表了 C 风格代码中的主要错误来源。
绝对没问题。一个更简单、更熟悉的案例是
int* x = new int;
delete x;
取消引用 x
的行为未定义,一些程序员会写 delete x; x = nullptr;
来强调这一点。
确认@BoPersson,阅读 delete
之后的 x
充其量是实现定义的,并且可能包含针对无效地址的硬件陷阱。参见 Is it legal to compare dangling pointers?
如果你想防止这种情况发生,你可以使用
std::shared_ptr
std::weak_ptr
但是如果你想在你的程序中创建这个场景,你能说出为什么吗?通常我们假设程序总是处于良好状态