我正在尝试使用新版本的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;
如果这还不足以解决问题,那么完整的样本就在这里:
答案 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
来初步显示您的问题。