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

时间:2015-10-26 14:41:13

标签: c++ seh

如果列表中有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;
}

此代码将生成“访问冲突读取”异常,并且无法捕获“try / catch”。我尝试使用“__try / __ except”,但这只会给我以下编译错误:

  

C2712:无法在需要对象展开的函数中使用__try。

3 个答案:

答案 0 :(得分:5)

您应该检查迭代器是否指向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(); } 时抛出一个激活,那么您可以使用

frameBorder="0"

答案 1 :(得分:4)

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

答案 2 :(得分:4)

嗯......你可以用/EHa标志构建你的项目。它可能将Win32异常转换为常规C ++异常。那么你可以用

来捕捉这些例外
catch(...){}

<强> 但是
你不应该依赖这种hackish方式来取代经常被证明的处理内存异常的方法 - 不要在第一时间创建它们!

通过定期空检查可以轻松解决您的问题。

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