EXC_BAD_ACCESS (код = 1, адрес = 0x0) происходит при передаче std :: map в качестве параметра для вызова виртуальной функции

У меня есть класс, который имеет следующую виртуальную функцию

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;

}

Код при запуске завершается, сказав Unknown File: Failure
Неизвестное исключение C ++, выданное в теле теста.

При отладке в XCode он показывает ошибку EXC_BAD_ACCESS (код = 1, адрес = 0xc0000000) в строке secure-> setPassword (secureParams);

Я пытался отладить проблему весь день. Любая помощь приветствуется 🙂

Заранее спасибо 🙂

0

Решение

Кажется, у вас нет объекта, который наследуется от 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() );
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]