“AfxIsValidAddress”函数的等效标准函数是啥?
Posted
技术标签:
【中文标题】“AfxIsValidAddress”函数的等效标准函数是啥?【英文标题】:What is the equivalent standard function of the "AfxIsValidAddress" function?“AfxIsValidAddress”函数的等效标准函数是什么? 【发布时间】:2017-06-26 12:19:47 【问题描述】:我使用的是 MFC 项目,该项目应在独立于平台的环境中进行保护,使用 std-function 而不是 MFC/AFX。
例如:使用 CString 代替 std::string,代替 CMutex 使用 std::mutex。
MFC 函数“AfxIsValidAddress”的独立于平台的 C++11 std::-等价物是什么?
【问题讨论】:
在标准 C++ 中,没有与AfxIsValidAddress
等价的东西。为什么你仍然需要它?它应该解决什么问题?在非调试版本中,它只是一个普通的空指针检查。
如果我检查实现,那么我会在这个函数内一次看到更多检查。那些在非调试版本中都是不活动的还是什么?
如果你需要使用AfxIsValidAddress
,你的代码有bug。修复错误,忘记损坏的 MFC 实现(调用损坏的 Windows API)。独立于平台的 C++11 std::
-equivalent 是不需要它的。如果你这样做了,你就在 UB 土地上,而且根本没有任何保证。
【参考方案1】:
标准库中没有类似于AfxIsValidAddress()
的东西,而且该函数似乎实际上并没有做太多的验证。
参见AfxIsValidAddress (and Others) Don’t Work as Advertised,它表示该函数最终只是针对 NULL 进行检查。关于有效地址检查功能系列,它也有这样的说法:
有几个功能相似的Win32 API:
IsBadWritePtr
,IsBadHugeWritePtr
,IsBadReadPtr
,IsBadHugeReadPtr
,IsBadCodePtr
,IsBadStringPtr
。至少从 2004 年就知道,这些 功能已损坏,无法修复,切勿使用。这 全能的 Raymond Chen 和 Larry Osterman 都讨论了其中的原因 细节,所以只是一个简短的重新散列: IsBad*Ptr 都可以通过访问 测试地址并捕获任何抛出的异常。问题是一个 其中一些访问违规(即堆栈守卫的那些 页面)永远不应该被抓住 - 操作系统使用它们来正确放大 线程堆栈。
我认为最好遵循标准 C++ 程序来检查指针是否不是 nullptr
,或者最好尽可能限制指针的使用。
【讨论】:
以上是关于“AfxIsValidAddress”函数的等效标准函数是啥?的主要内容,如果未能解决你的问题,请参考以下文章