在构造函数中更新指针向量时出现问题

Problems with updating a vector of pointers in a constructor

本文关键字:问题 向量 指针 构造函数 更新      更新时间:2023-10-16

stackoverflow! 对于我的最新任务,我遇到了一个我无法真正理解的问题。
它背后的想法非常简单,你有一个名为Dir_or_File的基本类,它表示(顾名思义(目录或文件。它们中的每一个本身都有两个变量,它有一个对应于其路径和entriesname,它由一个向量组成,该向量跟踪我的目录中包含的所有目录或文件。

为了帮助做到这一点,我制作了一个名为split_after_slash的方法,它将任何字符串转换为字符串向量,这些向量在每个斜杠后被拆分,"o1/o2/o3/"成为带有条目"o1/"、"o2"和"o3"的向量。此方法已经过测试,可以按预期工作。只是为了澄清,因为我稍后会使用它。

考虑到这一点,构造函数正在引起问题,这个想法是,我为我的构造函数提供一个路径(作为字符串(,它将启动一个目录。
例如:

Dir_or_File dir("/home/music/song.mp3");

应该创建Dir_or_File对象"dir",它由它的name组成,即"/home/music/song.mp3"和一个名为entries的向量,它本身将包含一个Dir_or_Filename为"home/music/song.mp3",entries带有一个名为"music/song.mp3"的Dir_or_File,依此类推。最后,您将拥有名为"song.mp3"的最后一个条目,其中包含一个空的entries列表。

我的想法是通过递归解决上述问题,我尝试了以下方式:

Dir_or_File::Dir_or_File(std::string name)
{
this->name = name;
std::vector<std::string> full_path = split_after_slash(name);
if (full_path.size() > 1)
{
std::string new_param;
for (unsigned int i = 1; i < full_path.size(); i++)
{
new_param.append(full_path[i]);
}
Dir_or_File new_entry(new_param);
entries.push_back(&new_entry);
}
}

设置name是不言自明的,拆分字符串也应该如此。之后,我只需要知道路径中是否还剩下多个字符串,这意味着我将在一个文件夹中,该文件夹仍然有一个子文件夹,如果有子文件夹,我将调用构造函数,除了我当前所在的文件夹之外的所有内容,如果没有子文件夹,我不需要添加任何条目, 好吧entries.
但是如果我现在测试我的代码,我可以创建一个Dir_or_File,它有一个entries条目,但仅此而已,该条目没有名称,但一些胡言乱语和一个空的entries向量,我在这里做错了什么?

这是我的方法的根本错误还是可以解决的问题?

是的。是的。

线条

Dir_or_File new_entry(new_param);
entries.push_back(&new_entry);

是你问题的根源。new_entry是函数中的局部变量。将其地址存储在entries中是不好的。当函数返回时,entries将包含一个悬空指针列表。

您可以使用几种方法解决问题。

  1. 使entries成为对象的向量,而不是指针的向量。然后,您可以使用

    entries.push_back(new_entry);
    
  2. 使用new分配动态内存,并将指针存储在entries中。

    Dir_or_File* new_entry = new Dir_of_File(new_param);
    entries.push_back(new_entry);
    

请注意,如果您使用第二种方法,则必须编写一堆预订代码来管理指针。使用第一种方法会更容易,这也将导致更少的错误代码。

您可以在entries中存储智能指针而不是原始指针,但即使这样也需要您了解如何智能指针。第一种方法仍然更好,IMO。