EDIT:今後の読者の皆様、std :: stringは問題とは関係ありません。それは未完成の配列だった。std :: string定義を追加するとアクセス違反が発生する
一言で言えば、問題は、単一のstd :: stringの宣言をC以外のプログラムに追加すると、エラー "Access violation reading location 0xfffffffffffffffe"が発生することです。
次のコードでは、std :: stringが宣言されている行がコメントアウトされている場合、プログラムはエラーなく完了します。ただし、行がプログラムに残っている場合(コメント化されていない場合)は、上記のAcess Violationエラーでプログラムがクラッシュします。実行中のプログラムをVS2010デバッガで開くと、ldap_search_sA()の呼び出し時にアクセス違反が発生しています。
宣言されたstd :: stringは決して使用されないことに注意してください。アクセス違反を引き起こすために使用する必要はありません。単に宣言すると、アクセス違反が発生します。
私はLDAPコードとは関係ないと疑っていますが、間違っている可能性があります。
int main()
{
try {
// Uncommenting the next line causes an Access Violation
// at the call to ldap_search_sA().
// std::string s;
LDAP* pLdapConnection = ldap_initA("eu.scor.local", LDAP_PORT);
ULONG version = LDAP_VERSION3;
ldap_set_option(pLdapConnection, LDAP_OPT_PROTOCOL_VERSION, (void*) &version);
ldap_connect(pLdapConnection, NULL);
ldap_bind_sA(pLdapConnection, NULL, NULL, LDAP_AUTH_NTLM);
LDAPMessage* pSearchResult;
PCHAR pMyAttributes[2];
pMyAttributes[0] = "cn";
pMyAttributes[1] = "description";
ldap_search_sA(pLdapConnection, "dc=eu,dc=scor,dc=local", LDAP_SCOPE_SUBTREE, "objectClass=computer)", pMyAttributes, 0, &pSearchResult);
} catch (...) {
printf("exception\n");
}
return 0;
}
私はこのLDAPのことは知らないけど、私の疑惑は_Undefined Behavior_どこかで呼び出され、文字列の定義[(!)](http://stackoverflow.com/questions/1410563/)がそれを明らかにするだけですAVとして。 – sbi
OKだから、実際にはLDAPの使い方が間違っていると思います。 (「はい」と答える必要はありません) –
はい、私はそれを信じていますが、バンタールは何が間違っているかを見つけました。 – sbi