我有以下内容:
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)
的地址/值会丢失。
有人可以解释发生了什么吗?
感谢。
答案 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
}