注意:标题可能与问题无关,因为我不明白问题的出处。
问题:我有一段代码从目录获取文件名并将其附加到vector < char* >
。
它可以正常工作,但是如果我将其包装在函数中,则会产生奇怪的行为,结果矢量元素将在控制台中打印单个随机字符,而不是文件名。
我已经检查并重新检查了所有内容,但看不到为什么发生。
下面是完整的可运行代码,我在Windows上使用cl.exe对其进行了编译
即cl.exe "a.cpp" /EHsc
。 x64本机环境和目标。
我将这两部分放在一起,以便于测试。
#include <windows.h>
#include <iostream>
#include <vector>
using namespace std;
void getimglist ( const char* mask, vector < char* > & flist )
{
WIN32_FIND_DATA data;
HANDLE hFind;
hFind = FindFirstFile ( mask, & data );
cout << "-fname: " << data.cFileName << "\n";
flist.push_back ( data.cFileName );
FindClose ( hFind );
}
int main (int argc, char* argv[])
{
vector < char* > L ;
vector < char* > L2 ;
const char* mask = ".\\input-cam0\\*.jpg";
const char* mask2 = ".\\input-cam0\\*.jpg";
// this code works
WIN32_FIND_DATA data;
HANDLE hFind;
hFind = FindFirstFile ( mask, & data );
cout << " first file: " << data.cFileName << "\n";
L.push_back ( data.cFileName );
FindClose (hFind);
// ***
cout << " size:" << L.size() << "\n";
cout << " first file L:" << L[0] << "\n";
// this works weird, output is different and wrong
cout << " ** function call **\n";
getimglist ( mask2, L2 );
cout << " size:" << L2.size() << "\n";
cout << " first file: " << L2[0] << "\n";
return 0;
} // end main
输出:
first file: 000-001.jpg
size:1
first file L:000-001.jpg
** function call **
-fname: 000-001.jpg
size:1
first file: R
请参阅最后一行^,这里是R
,如果我多次运行exe文件,它将显示单个随机字符。来自main
块的结果给出了正确的结果。问题出在哪里?
答案 0 :(得分:1)
WIN32_FIND_DATA data
在堆栈上分配,当变量超出范围时(在这种情况下,在函数末尾),堆栈内存被破坏。这意味着您存储在向量中的指针不再指向有效地址。当您打印它时,应用程序会愉快地打印指定内存段中的所有内容。
简单的解决方法是将字符串复制到新变量中,首选的方式是将向量更改为vector<std::string>
。您仍然可以调用flist.push_back ( data.cFileName )
,编译器将为您复制字符数组到std::string
中。