2014-04-15 2 views
0

나는 다음과 같은 가상 함수EXC_BAD_ACCESS (코드 = 1, 주소 = 0x0으로)가 발생

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

} 
} 

내가 다른 테스트 클래스가되어있는 클래스가 방법은 엑셀에서 암호와 사용자 이름을 가져 와서 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에서 디버깅 할 때 EXC_BAD_ACCESS (code = 1, address = 0xc0000000) 오류가 줄에 표시됩니다. secure-> setPassword (secureParams);

저는 하루 종일 문제를 디버깅하려고했습니다. 어떤 도움에 감사드립니다 :) 사전 : 당신은 책에서 상속 대상 : 안전, 추상 기본 클래스에 단지 스마트 포인터를하지 않는 것

+2

'보안'을 초기화하지 않았습니다 ... 관련이있을 수 있습니까? – rodrigo

+0

'address = 0x0'는'NULL' (또는'nullptr') 역 참조를 나타낼 가능성이 큽니다 ... 가상 함수가'= 0'으로 설정되었습니다 - 아마도 파생 클래스에서 가상 함수를 정의하지 않았으므로 추상 함수를 호출? – twalberg

+0

아니요 코드에 영향을주지 않습니다 ... –

답변

1

에서

감사합니다. 실제 객체를 가리 키도록 설정되지 않은 스마트 포인터를 참조 해제하면 충돌이 발생합니다.

명확한 설명 :

1) 당신은 당신은 클래스를 인스턴스화하고 사용하기 전에 당신의 스마트 포인터 지점을 만들 필요)

namespace Book 
{ 

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

이 보안 :: 책에서 상속 인스턴스 작성 클래스가 필요 스마트 포인터 :

secure.reset(new Foo()); 
+0

시도해 보았습니다. 여전히 BAD_ACCESS를 받고 있습니다. –

+0

고마워 :) 그 작품 –

관련 문제