为什么std :: vector导致std :: map不会崩溃?

时间:2014-12-24 00:28:14

标签: c++ sql-server freetds

我正在尝试使用新版本的freetds(版本0.91)。我的代码在0.64版本上运行良好,但升级后,它给了我指针错误。为了找出原因,我构建了一个精简的例子。让我感到困惑的一件事是,当我使用std :: map存储值时,示例代码似乎运行正常。但是当我切换到将值存储在向量中时,当我调用ct_bind时,我得到一个无效的指针错误:

*** glibc detected *** test: free(): invalid pointer: 0x00b06164 ***

有效的地图代码:

pszColName = (datafmt.namelen) ? datafmt.name : "";
pszColValue = (char*)malloc ((int)(datafmt.maxlength + 1)*sizeof(char));
if (ct_bind (m_pCtCommand, iCol+1, &datafmt, pszColValue, &datalength, &ind) != CS_SUCCEED) {
    return false;
}
queryResults.insert (std::pair<std::string,char*>(pszColName,pszColValue));

崩溃的矢量代码:

pszColName = (datafmt.namelen) ? datafmt.name : "";
pszColValue = (char*)malloc ((int)(datafmt.maxlength + 1)*sizeof(char));
if (ct_bind (m_pCtCommand, iCol+1, &datafmt, pszColValue, &datalength, &ind) != CS_SUCCEED) {
    return false;
}
names [iCol] = pszColName;
values[iCol] = pszColValue;

如果这还不足以解决问题,那么完整的样本就在这里:

with map

With vector

1 个答案:

答案 0 :(得分:1)

您在向量上调用reserve

names.reserve(num_cols);
values.reserve(num_cols);

但这只会影响他们的能力。它实际上并没有向它们添加元素。然后,你直接这样做:

names [iCol] = pszColName;
values[iCol] = pszColValue;

对仍然大小为零的向量。这是未定义的行为!您要做的是最初resize()两个向量num_cols或仅push_back()值:

names.push_back(pszColName);
values.push_back(pszColValue);

此外,由于这两者是紧密耦合的,你可以只有:

std::vector<std::pair<std::string, char*> > values;

代码中的其他问题包括外部计算向量大小而不是依赖于size()方法 - 这将通过返回0来初步显示您的问题。