[英]C++: Pointer value changed exiting a function
我需要包装来自非托管C ++库的字符串向量,并且这样做必须将vector<string>
转换为char***
。 对于此转换,我正在使用一个函数。 但是,即使内部看起来正确,指针值也会立即变为无效。
这是一个简单的例子:
int main() {
cout << "Start of the program" << endl;
vector<string> vStr = vector<string>();
vStr.push_back("ABC");
vStr.push_back("DEF");
vStr.push_back("GHI");
vStr.push_back("JKL");
vStr.push_back("MNO");
vStr.push_back("PQR");
char*** pStr = new char**();
int* pLength = new int();
cout << " > before export" << endl;
exportVector(vStr, pStr, pLength);
cout << " < after export" << endl;
cout << "\t pLength value = " << *pLength << endl;
for (unsigned int i = 0 ; i < vStr.size(); i++)
{
cout <<"\t pStr "<< i << ": " << vStr[i] << " to ";
for(unsigned int j = 0; j < 3; ++j)
{
cout << "-" << pStr[0][i][j];
}
cout << "-"<< endl;
}
cout << "End of the program" << endl;
delete pStr;
delete pLength;
return 0;
}
void exportVector(vector<string> vect, char*** pData, int* pSize)
{
vector<char*> charVect = vector<char*>(vect.size());
//cout << "\t charVect.size() = " << charVect.size() << endl;
// Copy and cast elements of given vector into chars
for(unsigned int i = 0; i < vect.size() ; i++)
{
charVect[i] = const_cast<char*>(vect[i].c_str());
}
*pData = &charVect[0];
*pSize = vect.size();
cout << "\t pSize = " << *pSize << endl;
for (unsigned int i = 0 ; i < vect.size(); i++)
{
cout <<"\t pData "<< i << ": ";
for(unsigned int j = 0 ; j < 3 ; ++j)
{
cout << "-" << pData[0][i][j];
}
cout << "-"<< endl;
}
}
我进入控制台:
Start of the program
> before export
pSize = 6
pData 0: -A-B-C-
pData 1: -D-E-F-
pData 2: -G-H-I-
pData 3: -J-K-L-
pData 4: -M-N-O-
pData 5: -P-Q-R-
< after export
pLength value = 6
pStr 0: ABC to -Ä- -i-
pStr 1: DEF to - - -i-
pStr 2: GHI to -G-H-I-
pStr 3: JKL to -J-K-L-
pStr 4: MNO to -M-N-O-
pStr 5: PQR to -P-Q-R-
End of the program
如何解释exportVector
函数内部和外部值之间的差异? 如何纠正?
非常感谢。
您正在将向量按值传递给exportVector函数! 函数返回后向量将被破坏,并且您的char *指针变为孤立的,指向的内存位置随后可能会被重用于其他目的...
另外,您的const_cast
应该已经响起了很多警钟! 切勿执行const_cast
(除非您知道这样做很安全,这是极少数的情况,但这不是其中之一)!
但是这些并不是代码中唯一的问题。 您如何看待char*** pStr = new char**();
是在做? 它的作用是为一个指向char的指针(通常为4-8字节)保留一个空间。 您似乎认为以某种方式神奇地为多个字符数组分配了空间?
您需要通过参考传递您的载体
void exportVector(vector<string> &vect, char*** pData, int* pSize)
,也应该在这里使用strdup:
charVect[i] = const_cast<char*>(vect[i].c_str());
//should be
charVect[i] = strdup(vect[i].c_str());
最后,
vector<char*> charVect = vector<char*>(vect.size());
*pData = &charVect[0];
将导致段错误,因为charVect将在函数末尾销毁,您需要删除这些行并执行以下操作:
(*pData) = new char*[vect.size()];
// Copy and cast elements of given vector into chars
for(unsigned int i = 0; i < vect.size() ; i++)
{
(*pData)[i] = strdup(vect[i].c_str());
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.