C++ Vector 奇怪的行为
Posted
技术标签:
【中文标题】C++ Vector 奇怪的行为【英文标题】:C++ Vector weird behaviour 【发布时间】:2014-11-28 17:12:01 【问题描述】:我有这段代码遍历一个目录,获取文件名并将它们推送到一个向量中。
std::vector<const char*> afp_filenames;
if ((dir = opendir (path.c_str())) != NULL)
while ((ent = readdir (dir)) != NULL)
if ( (ent->d_name[0] == '.') ) continue;
afp_filenames.push_back((const char*)ent->d_name);
cout <<afp_filenames[i]<<"\n";
i++;
cout 打印正确的文件名。当我再次打印存储在向量中的值时,问题就出现了。使用迭代器时我得到相同的结果。
for (j = 0; j < i; j++)
cout <<afp_filenames[j]<<"\n";
这是我在控制台中获得的示例。 对于第一个循环:
afp_PortaAPorta_5_318_383.dat
afp_PortaAPorta_5_407_663.dat
afp_PortaAPorta_5_485_510.dat
afp_781_5_472_371.dat
afp_781_5_115_617.dat
afp_781_5_358_509.dat
afp_781_5_276_348.dat
第二个:
2.dat
.dat
afpò
9.dat
2.dat
5_356_572.dat
5_291_435.dat
afp_781_5_243_558.dat
afp_PortaAPorta_5_352_716.dat
afp_781_5_111_541.dat
【问题讨论】:
可能您只需要复制字符串,因为您从 d_name 获得的指针可能会在一段时间后成为垃圾。 @gd1 ...只是我的想法。请改用std::string
作为元素类型。
虽然这个问题并不“精彩”,但我认为不值得投票或结束。能详细点吗?
使用std::vector
和std::string
会轻松解决许多问题。你已经成功了一半。
【参考方案1】:
您将const char *
s 存储在向量中,但是当您到达第二个循环时指针不再有效,因此cout
正试图打印出它们指向的内存中剩余的任何内容。
来自readdir:
成功时,readdir() 返回一个指向不同结构的指针。 (这个结构可能是静态分配的;不要试图释放(3)它。)
系统调用返回的结构体的生命周期似乎由kernel C 库管理。
【讨论】:
【参考方案2】:您正在存储指向由readdir
返回的内存的const char *
指针。
每man 3 readdir
:
readdir() 返回的数据可能会被后续对同一目录流的 readdir() 调用覆盖。
因此,您的 ent->d_name
条目将在每个循环中被覆盖。
使用vector<std::string>
代替,以便您存储字符串的副本(作为额外的好处,您不必担心分配/取消分配字符串,因为它会为您处理)。
【讨论】:
【参考方案3】:您可能只需要复制字符串,因为您从d_name
获得的指针可能会在一段时间后指向垃圾或其他东西。制作一个std::string
s 的向量并将字符串推入其中。
【讨论】:
以上是关于C++ Vector 奇怪的行为的主要内容,如果未能解决你的问题,请参考以下文章