我有以下内容:
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).
有人能解释一下发生了什么吗?
谢谢.
当您这样做时,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)
或者