C++:退出函数时指针值已更改
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
?如何纠正?
多谢。
你需要通过引用传递你的向量
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];
会不会有段错误导致字符在函数结束时被破坏,您需要删除这些行并执行以下操作:
(*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());
}
你正在按值将向量传递给 exportVector 函数!在函数返回后,向量被破坏,并且您的 char* 指针被孤立,指向之后可能被重用于其他目的的内存位置......
另外,你的const_cast
应该已经敲响了很多警钟!永远不要做const_cast
(除了极少数情况下,你知道这样做是安全的 - 这不是其中之一)!
但这些并不是代码中唯一的问题。你认为char*** pStr = new char**();
在做什么?它的作用是为一个指向字符指针(通常为 4-8 字节)的指针保留空间。您似乎认为以某种方式神奇地为众多字符数组分配了空间?
相关文章:
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- 1d 智能指针不适用于语法 (*)++
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 为什么使用 "this" 指针调用派生成员函数?
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用指针从C++中的数组中获取最大值
- 助记符和指向成员语法的指针
- 嵌入方指针压缩已禁用
- 数组的指针从不分段故障
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- C++::在构造函数退出之前通过指针调用成员函数
- 如何将指针分配给功能中的新对象,而不会使该对象在退出后消失
- 存储在全局变量中的函数指针在进入函数时设置为 0,并在退出函数时返回到以前的状态
- 为什么我的新分配指针会自动在程序退出上删除
- C++映射的指针在退出时自动释放,如何处理删除
- C++:退出函数时指针值已更改
- 当退出 new/malloc 函数时,从 new/malloc 返回的指针如何保持在范围内
- 当构造函数退出时,指针将失去引用
- 多项式程序中的C++动态数组和指针导致退出错误255
- 如何处理没有退出的空指针