Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 检查指向自定义类的指针是否不再存在_C++_Winapi - Fatal编程技术网

C++ 检查指向自定义类的指针是否不再存在

C++ 检查指向自定义类的指针是否不再存在,c++,winapi,C++,Winapi,我有一个通过引用传递的另一个对象构造的对象。传递给构造函数的对象如下所示: HTTPServerResponse::HTTPServerResponse(Poco::Net::HTTPServerResponse &response) 我的包装器类(HTTPServerResponse)会在某个时候销毁response,但它也不会销毁自身。实际上,response可能会因为多种(外部)原因而被破坏,甚至在我的类之外 我想要的是在调用response上的任何其他方法之前检查它是否存在

我有一个通过引用传递的另一个对象构造的对象。传递给构造函数的对象如下所示:

 HTTPServerResponse::HTTPServerResponse(Poco::Net::HTTPServerResponse &response)
我的包装器类(
HTTPServerResponse
)会在某个时候销毁
response
,但它也不会销毁自身。实际上,
response
可能会因为多种(外部)原因而被破坏,甚至在我的类之外

我想要的是在调用
response
上的任何其他方法之前检查它是否存在

我试过:

if(!response) {...
这产生了
错误C2675:一元'!':'Poco::Net::HTTPServerResponse'未定义此运算符或到预定义运算符可接受类型的转换
;当然,我也尝试过:

if(response) {...
这也失败了,错误为C2451:Poco::Net::HTTPServerResponse类型的条件表达式是非法的;没有可执行此转换的用户定义的转换运算符,或者无法调用该运算符


如何修复此混乱?

您永远无法知道所指向的引用或指针是否无效(请参阅)


你只需要小心(并且清楚)谁拥有引用/指针,谁应该删除它。为了帮助获得所有权,您可以使用std::unique\u ptr或std::shared\u ptr(在C++0x中,使用boost版本,否则)。

您真的需要知道对象是否存在吗?了解水槽设计模式。它通常用于增压Asio。如果您使用的是指针,那么您必须记住在删除等操作之后将指针设为空。。。尝试使用smart_ptr


对我来说,很难想象为什么需要检查指针是否仍然存在。代码中存在设计问题

最后,我让整个线程都很忙,在我完成之前阻止删除该对象。我知道它是redneck,但它省去了我在整个代码中进行redneck的麻烦。

你无法知道对象是否被删除/释放。请考虑做一个更好的设计。@ Pubby,你能提供一个例子作为答案吗?用一个指针,如果对象被删除,他不会得到空。我同意@DaniYou不能对已删除的对象调用方法(如果您尝试,您将得到未定义的行为),但如果是您自己的代码执行删除,您可以设置一个标志(或将相应的指针设置为NULL)来指示您已删除它。然后,您的代码可以在尝试访问对象之前检查该标志/指针的状态。如果该对象可以在您不知情的情况下删除,这将是一个真正的问题,您需要重新设计以避免它。使用共享的ptr自动管理对象的生存期而不是手动删除它是一种很好的方法。这听起来像是
shared\u ptr
weak\u ptr
的用例。如果我试图在
语句中引用它,请尝试{}catch(){}
语句,您能解释一下为什么我的应用程序仍然崩溃吗?没有通用/自动的方法来检测引用是否仍然指向有效对象。语言运行库和您都不能这样做。那么谁应该抛出您试图捕获的异常呢?因为访问悬空指针/引用是未定义的行为,没有任何东西会抛出异常。看见