我可以存储指向不存在的数据的指针而不调用未定义的行为吗?

时间:2015-10-08 12:28:23

标签: c++ pointers 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.

3 个答案:

答案 0 :(得分:4)

是的,您的代码中没有未定义的行为。你得到的是两个悬空指针,即xy。如果你没有取消引用它们(或者再次释放它们),它们就完全可以了,但它们代表了C风格代码中错误的主要来源。

答案 1 :(得分:2)

绝对没问题。一个更简单,更熟悉的案例是

int* x = new int;
delete x;

解除引用x时的行为未定义,一些程序员会编写delete x; x = nullptr;来强调这一点。

确认@BoPersson,在x之后阅读delete充其量是实现定义的,并且可能包含无效地址的硬件陷阱。见Is it legal to compare dangling pointers?

答案 2 :(得分:1)

如果您想防止发生这种情况,可以使用

std::shared_ptr
std::weak_ptr

但是如果你想在你的程序中创建这个场景,你能说出原因吗?通常我们假设程序始终处于良好状态