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::vectorstd::string 会轻松解决许多问题。你已经成功了一半。 【参考方案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 的向量并将字符串推入其中。

【讨论】:

以上是关于C++ Vector 奇怪的行为的主要内容,如果未能解决你的问题,请参考以下文章

标准 C++ 线程 ID - 奇怪的行为

C++ 中的 if 语句行为真的很奇怪

当对头元素使用引用时,C++ 优先级队列的行为很奇怪

std::vector<QString,int*> 的奇怪行为

添加到 std::vector 时类字段的奇怪行为

Std::vector 被初始化为垃圾。奇怪的行为。有啥想法吗?