编辑:亲爱的 future 读者,std::string与该问题无关。这是一个未终止的数组。

简而言之,问题在于向一个仅包含C的程序添加单个std::string的声明会导致错误“访问冲突读取位置0xfffffffffffffffffe”。

在下面的代码中,如果注释掉std::string的行被注释掉,则程序将完全运行而不会出错。但是,如果该行保留在程序中(未注释),则程序将崩溃,并出现上述“访问冲突”错误。当我在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;
}

最佳答案

    PCHAR pMyAttributes[2];
    pMyAttributes[0] = "cn";
    pMyAttributes[1] = "description";

属性数组应以NULL终止:
    PCHAR pMyAttributes[3];
    pMyAttributes[0] = "cn";
    pMyAttributes[1] = "description";
    pMyAttributes[2] = NULL;

关于c++ - 添加std::string定义会导致访问冲突,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8559758/

10-13 08:23