处理向量迭代中的访问冲突异常

Handle access violation exception in vector iteration

当列表中存在NULL对象时,如何处理异常?

#include <iostream>
#include <string>
#include <vector>
#include <exception>
#include <Windows.h>

using namespace std;

class Test {


public:
    string m_say;

    void Say() {

        cout << m_say << endl;
    }
    Test(string say) {

        m_say = say;
    }

};

int _tmain(int argc, _TCHAR* argv[])
{

    vector<Test*> lst;

    Test * a = new Test("YO!");

    lst.push_back(a);

    lst.push_back(nullptr);

    for (vector<Test*>::iterator iter = lst.begin(); iter != lst.end(); iter++)
    {
        try {
            Test * t = *iter;
            t->Say();
        }
        catch (exception& e) {
            cout << e.what() << endl;
        }
        catch (...) {
            cout << "Error" << endl;
        }
    }

    return 0;
}

这段代码会产生"access violation reading"异常,无法用"try/catch"捕获。我试过使用“__try/__except”,但这只会给我以下编译错误:

C2712: Cannot use __try in functions that require object unwinding..

您应该检查迭代器是否指向 nullptr

for (vector<Test*>::iterator iter = lst.begin(); iter != lst.end(); iter++)
{
    if (*iter != nullptr)
        (*iter)->Say();
}

编辑

如果你想在遇到 nullptr 时抛出异常,那么你可以使用

for (vector<Test*>::iterator iter = lst.begin(); iter != lst.end(); iter++)
{
    if (*iter == nullptr)
        throw some_type_of_excpetion;
    (*iter)->Say();
}

与 Java 等语言相比,如果取消引用空指针,C++ 不会抛出异常。您必须显式检查空指针。

好吧...您可以 使用/EHa 标志构建您的项目。它可能 将 Win32 异常转换为常规 C++ 异常。然后你可以用

捕捉这些异常
catch(...){}

但是
您不需要依赖这种骇人听闻的方法来替换常规的 -​​ 经验证的处理内存异常的方法 - 不要一开始就创建它们!

您的问题很容易通过定期空检查得到解决。

if (t){
  t->Say();
}