如果某个指针引用的对象被某人删除(我们不知道谁删除它),但我仍然有指向它的原始指针。如何验证它是否有效。我虽然null检查会有所帮助,但事实并非如此。
以下是一个例子:
int main()
{
class A
{
public:
A() = default;
~A() = default;
private:
int a;
long b;
};
A* a = new A();
delete a; // deleted here
A* b = reinterpret_cast< A* >( a ); // still trying to use it
if( b == nullptr )
std::cout << "B is Null"; // b should have come as null, but it does not and I do not see this line in output.
// same here
A* c = ( A* ) a;
if( c == nullptr )
std::cout << "C is null";
getchar();
return 0;
}
如果你在上面的图片中看到,a不是null,并且有一些垃圾值。
我知道这是非常天真的代码,但这显示了我对实际代码的问题。
谢谢, 凯拉斯
答案 0 :(得分:3)
不,您无法知道指针是否指向有效内存。
来自here:
因为维护关于什么的元数据会很昂贵 构成一个有效的指针,什么不是,在C ++中你不付钱 因为你不想要的东西。
此外,您并不需要检查指针是否有效,因为您作为程序员知道指针的来源。
答案 1 :(得分:-5)
您可以使用if(!a)
或if(a)
进行验证。