C ++矢量奇怪的行为

时间:2014-11-28 17:12:01

标签: c++ vector

我有这段代码迭代一个目录,获取文件名并将它们推送到一个向量中。

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

3 个答案:

答案 0 :(得分:4)

您正在向量中存储const char *,但是当您到达第二个循环时指针不再有效,因此cout正在尝试打印出内存中剩余的内容指着。

来自readdir

  

成功时,readdir()返回指向dirent结构的指针。 (这种结构可以静态分配;不要试图释放它(3)它。)

系统调用返回的struct的生命周期似乎由内核 C库管理。

答案 1 :(得分:3)

您正在存储指向const char *返回的内存的readdir指针。

man 3 readdir

  

readdir()返回的数据可能会被后续对同一目录流的readdir()调用覆盖。

因此,每个循环都会覆盖您的ent->d_name条目。

使用vector<std::string>代替您存储字符串的副本(作为额外的好处,您不必担心分配/取消分配字符串,因为它会为你处理。)

答案 2 :(得分:2)

可能你只需要复制字符串,因为你从d_name获得的指针可能会在一段时间后最终指向垃圾或其他东西。制作std::string s的向量并将字符串推入其中。