处理向量迭代中的访问冲突异常
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();
}
当列表中存在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();
}