【发布时间】:2017-10-08 06:32:45
【问题描述】:
可能这是一个非常愚蠢的问题。但我不知道这个问题的答案。
如果指针所指的对象被某人删除(我们不知道是谁在删除它),但我仍然有指向它的原始指针。如何验证它是否有效。我虽然空检查会有所帮助,但它没有。
这是一个例子:
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 不为空,并且有一些垃圾值。
我知道这是非常幼稚的代码,但这表明我在实际代码中遇到的问题。
谢谢, 凯拉斯
【问题讨论】:
-
您无法验证指针是否指向有效内存,您只需要了解自己即可。
-
在每个系统的基础上,许多人做代码断言检查指针是否指向有效内存。什么是有效的,但系统之间的差异很大,因此您必须对每个系统进行本地编码。老实说,这是一张很棒的支票,
-
您应该将
new A()创建的指针存储到std::unique_ptr<A>中。这样它会在超出范围时自动销毁(您仍然可以手动删除它)。这并不能完全回答您的问题,但在您的代码 sn-p 中它会解决您的问题。
标签: c++ c++11 pointers nullpointerexception void-pointers