将std :: map作为参数传递给虚函数调用时发生EXC_BAD_ACCESS(code = 1,address = 0x0)

时间:2014-04-15 15:34:19

标签: c++ map exception-handling exc-bad-access

我有一个具有以下虚函数的类

namespace Book
{
class Secure
{
virtual Result setPassword(const std::map<std::string, std::vector<std::string> >& params)=0;

}
}

我有另一个测试类,其中一个方法从excel获取密码和用户名,并将其设置为映射secureParams并设置当前文件的密码。

bool initialize(std::string bookPath, std::string loginPath, std::string userName, std::string password)

{
Book::SharedPtr<Book::Secure> secure;
bool result;
std::map<std::string, std::vector<std::string> > secureParams;

std::vector<std::string> userNames;
std::vector<std::string> passwords;

userNames.push_back(userName);
passwords.push_back(password);

secureParams.insert(std::pair<std::string, std::vector<std::string>>("USERNAME",userNames);
secureParams.insert(std::pair<std::string, std::vector<std::string>>("PASSWORD",passwords);

secure->setPassword(secureParams);

secure->getLoginFile(loginPath.c_str());

result=Book::SecureBook::canLogin(bookPath.c_str(),secure);

return result;

}

运行时的代码终止,说明未知文件:失败 测试正文中抛出了未知的C ++异常。

在XCode中调试时,它在行secure-&gt; setPassword(secureParams)中显示EXC_BAD_ACCESS(代码= 1,地址= 0xc0000000)错误;

我一直在努力调试这个问题。任何帮助表示赞赏:)

提前致谢:)

1 个答案:

答案 0 :(得分:1)

你似乎没有一个继承自Book :: Secure的对象,只是一个指向抽象基类的智能指针。当您取消引用从未设置为指向实际对象的智能指针时,会发生崩溃。

澄清:

1)您需要一个可从Book :: Secure

继承的可实例化类
namespace Book
{

class Foo : public Secure
{
public:
virtual Result setPassword(const std::map<std::string, std::vector<std::string> >& params) {
  cout << "setPassword called" << endl; 
}
}
}

2)在使用智能指针之前,需要实例化类并使智能指针指向它:

secure.reset( new Foo() );