【问题标题】:C++ Vector weird behaviourC++ Vector 奇怪的行为
【发布时间】: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::vectorstd::string 会轻松解决许多问题。你已经成功了一半。

标签: c++ vector


【解决方案1】:

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

来自readdir

成功时,readdir() 返回一个指向不同结构的指针。 (这个结构可能是静态分配的;不要试图释放(3)它。)

系统调用返回的结构体的生命周期似乎由kernel C 库管理。

【讨论】:

    【解决方案2】:

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

    man 3 readdir:

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

    因此,您的 ent-&gt;d_name 条目将在每个循环中被覆盖。

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2011-05-12
        • 2011-03-06
        • 2016-03-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-08
        • 1970-01-01
        相关资源
        最近更新 更多