C ++从函数返回指针。价值观丢失了

时间:2011-06-20 13:06:07

标签: c++ pointers

我有以下内容:

void Class1::method()
{
  QStringList* file_list;
  collect_file_paths(file_list);    //Sends pointer to the method below
}

void Class1::collect_file_paths(QStringList* file_list)
{
  //Gather file paths
  DirectorySearch ds;
  connect(&ds, SIGNAL(updateStatus(QString)), this, SLOT(onStatusUpdate(QString)));
  file_list = ds.get_file_names(_strPath);  //Returns a pointer of QStringList
}

QStringList* DirectorySearch::get_file_names(QString path)
{
  QStringList *file_names = new QStringList;
  traverse(path, file_names);
  compare_existing(file_names);
  return file_names;  //returning pointer address
}

当我离开get_file_names()的范围时,发生的事件是Class1::collect_file_paths()返回的内存地址丢失/删除。我的理解是DirectorySearch类中的QStringList *file_names = new QStringList;现在在内存堆上。所以它应该留在堆上,直到我调用delete,即它永远不会超出范围。但是,如上所述,当我从QStingList返回Class1::method()时,collect_file_paths(file_list)的地址/值会丢失。

有人可以解释发生了什么吗?

感谢。

5 个答案:

答案 0 :(得分:7)

执行file_list = ds.get_file_names(_strPath); //Returns a pointer of QStringList 时,您正在更改file_list(32 / 64b内存位置)的值,而不是内存位置所代表的数据值。

您需要传递对指针(或指针指针)的引用

void Class1::method()
{
  QStringList* file_list;
  collect_file_paths(&file_list);    //Sends pointer to pointer to the method below
}

void Class1::collect_file_paths(QStringList** file_list)
{
  //Gather file paths
  DirectorySearch ds;
  connect(&ds, SIGNAL(updateStatus(QString)), this, SLOT(onStatusUpdate(QString)));
  *file_list = ds.get_file_names(_strPath); //set value of pointer in caller to value returned by below function
}
...

左右

答案 1 :(得分:2)

您的collect_file_paths方法不会以任何可见的方式修改file_list指针。调用collect_file_paths时,会给它一个QStringList的内存地址(指针)。如果您要分配给file_list变量,则只需指向其他QStringList,但调用者无法看到此内容。

就好像你写了以下内容:

void foo(int a)
{
  /* Callers will not see this change. */
  a = 5;
}

您需要做的是将指针传递给指针:

void collect_file_paths(QStringList **file_list)
{
  *file_list = ...
}

void foo()
{
  QStringList *file_names;
  collect_file_paths(&file_names);
}

答案 2 :(得分:1)

get_file_names()方法很好。您的问题是collect_file_paths()file_list指针被复制到函数中,因此在collect_file_paths中分配它对file_list中的method变量没有影响。

一种选择是使用对指针的引用:

void Class1::collect_file_paths(QStringList*& file_list) ...

或者,正如其他人所说的那样,只需传递对列表本身的引用并采取行动。

答案 3 :(得分:1)

评论:

  collect_file_paths(file_list);    //Sends pointer to the method below

错误:调用将指针复制到方法参数。

所以这一行:

file_list = ds.get_file_names(_strPath);  //Returns a pointer of QStringList

method()方法中没有任何值。

答案 4 :(得分:0)

您需要通过引用返回结果:

void Class1::collect_file_paths(QStringList& file_list)
{
  //Gather file paths
  DirectorySearch ds;
  connect(&ds, SIGNAL(updateStatus(QString)), this, SLOT(onStatusUpdate(QString)));
  file_list = ds.get_file_names(_strPath);  //Returns a pointer of QStringList
}