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

nf3*_*743 5 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
}
Run Code Online (Sandbox Code Playgroud)

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

有人能解释一下发生了什么吗?

谢谢.

Kit*_*YMG 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
}
...
Run Code Online (Sandbox Code Playgroud)

或者