“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:IsBadWritePtrIsBadHugeWritePtr, IsBadReadPtr, IsBadHugeReadPtr, IsBadCodePtr, IsBadStringPtr。至少从 2004 年就知道,这些 功能已损坏,无法修复,切勿使用。这 全能的 Raymond Chen 和 Larry Osterman 都讨论了其中的原因 细节,所以只是一个简短的重新散列: IsBad*Ptr 都可以通过访问 测试地址并捕获任何抛出的异常。问题是一个 其中一些访问违规(即堆栈守卫的那些 页面)永远不应该被抓住 - 操作系统使用它们来正确放大 线程堆栈。

我认为最好遵循标准 C++ 程序来检查指针是否不是 nullptr,或者最好尽可能限制指针的使用。

【讨论】:

以上是关于“AfxIsValidAddress”函数的等效标准函数是啥?的主要内容,如果未能解决你的问题,请参考以下文章

PHP:是不是有 isLetter() 函数或等效函数?

python函数.size()的sql等效函数是啥?

等效的 C 函数,不同的结果

Excel 的 NORMSDIST 函数的 MATLAB 等效项是啥?

Python中matlab imfilter的等效函数

linq 等效于通用函数的'select *' sql?