You've already forked godot
mirror of
https://github.com/godotengine/godot.git
synced 2025-11-13 13:31:48 +00:00
Convert uses of DirAccess * to DirAccessRef to prevent memleaks
`DirAccess *` needs to be deleted manually, and this is often forgotten especially when doing early returns with `ERR_FAIL_COND`. `DirAccessRef` is deleted automatically when it goes out of scope. Co-authored-by: bruvzg <7645683+bruvzg@users.noreply.github.com>
This commit is contained in:
@@ -1569,10 +1569,8 @@ String Directory::get_current_dir() {
|
||||
Error Directory::make_dir(String p_dir) {
|
||||
ERR_FAIL_COND_V_MSG(!d, ERR_UNCONFIGURED, "Directory is not configured properly.");
|
||||
if (!p_dir.is_relative_path()) {
|
||||
DirAccess *d = DirAccess::create_for_path(p_dir);
|
||||
Error err = d->make_dir(p_dir);
|
||||
memdelete(d);
|
||||
return err;
|
||||
DirAccessRef da = DirAccess::create_for_path(p_dir);
|
||||
return da->make_dir(p_dir);
|
||||
}
|
||||
return d->make_dir(p_dir);
|
||||
}
|
||||
@@ -1580,10 +1578,8 @@ Error Directory::make_dir(String p_dir) {
|
||||
Error Directory::make_dir_recursive(String p_dir) {
|
||||
ERR_FAIL_COND_V_MSG(!d, ERR_UNCONFIGURED, "Directory is not configured properly.");
|
||||
if (!p_dir.is_relative_path()) {
|
||||
DirAccess *d = DirAccess::create_for_path(p_dir);
|
||||
Error err = d->make_dir_recursive(p_dir);
|
||||
memdelete(d);
|
||||
return err;
|
||||
DirAccessRef da = DirAccess::create_for_path(p_dir);
|
||||
return da->make_dir_recursive(p_dir);
|
||||
}
|
||||
return d->make_dir_recursive(p_dir);
|
||||
}
|
||||
@@ -1593,19 +1589,14 @@ bool Directory::file_exists(String p_file) {
|
||||
if (!p_file.is_relative_path()) {
|
||||
return FileAccess::exists(p_file);
|
||||
}
|
||||
|
||||
return d->file_exists(p_file);
|
||||
}
|
||||
|
||||
bool Directory::dir_exists(String p_dir) {
|
||||
ERR_FAIL_COND_V_MSG(!d, false, "Directory is not configured properly.");
|
||||
if (!p_dir.is_relative_path()) {
|
||||
DirAccess *d = DirAccess::create_for_path(p_dir);
|
||||
bool exists = d->dir_exists(p_dir);
|
||||
memdelete(d);
|
||||
return exists;
|
||||
return DirAccess::exists(p_dir);
|
||||
}
|
||||
|
||||
return d->dir_exists(p_dir);
|
||||
}
|
||||
|
||||
@@ -1624,11 +1615,9 @@ Error Directory::rename(String p_from, String p_to) {
|
||||
ERR_FAIL_COND_V_MSG(p_from.is_empty() || p_from == "." || p_from == "..", ERR_INVALID_PARAMETER, "Invalid path to rename.");
|
||||
|
||||
if (!p_from.is_relative_path()) {
|
||||
DirAccess *d = DirAccess::create_for_path(p_from);
|
||||
ERR_FAIL_COND_V_MSG(!d->file_exists(p_from) && !d->dir_exists(p_from), ERR_DOES_NOT_EXIST, "File or directory does not exist.");
|
||||
Error err = d->rename(p_from, p_to);
|
||||
memdelete(d);
|
||||
return err;
|
||||
DirAccessRef da = DirAccess::create_for_path(p_from);
|
||||
ERR_FAIL_COND_V_MSG(!da->file_exists(p_from) && !da->dir_exists(p_from), ERR_DOES_NOT_EXIST, "File or directory does not exist.");
|
||||
return da->rename(p_from, p_to);
|
||||
}
|
||||
|
||||
ERR_FAIL_COND_V_MSG(!d->file_exists(p_from) && !d->dir_exists(p_from), ERR_DOES_NOT_EXIST, "File or directory does not exist.");
|
||||
@@ -1638,10 +1627,8 @@ Error Directory::rename(String p_from, String p_to) {
|
||||
Error Directory::remove(String p_name) {
|
||||
ERR_FAIL_COND_V_MSG(!is_open(), ERR_UNCONFIGURED, "Directory must be opened before use.");
|
||||
if (!p_name.is_relative_path()) {
|
||||
DirAccess *d = DirAccess::create_for_path(p_name);
|
||||
Error err = d->remove(p_name);
|
||||
memdelete(d);
|
||||
return err;
|
||||
DirAccessRef da = DirAccess::create_for_path(p_name);
|
||||
return da->remove(p_name);
|
||||
}
|
||||
|
||||
return d->remove(p_name);
|
||||
@@ -1664,7 +1651,6 @@ void Directory::_bind_methods() {
|
||||
ClassDB::bind_method(D_METHOD("make_dir_recursive", "path"), &Directory::make_dir_recursive);
|
||||
ClassDB::bind_method(D_METHOD("file_exists", "path"), &Directory::file_exists);
|
||||
ClassDB::bind_method(D_METHOD("dir_exists", "path"), &Directory::dir_exists);
|
||||
//ClassDB::bind_method(D_METHOD("get_modified_time","file"),&Directory::get_modified_time);
|
||||
ClassDB::bind_method(D_METHOD("get_space_left"), &Directory::get_space_left);
|
||||
ClassDB::bind_method(D_METHOD("copy", "from", "to"), &Directory::copy);
|
||||
ClassDB::bind_method(D_METHOD("rename", "from", "to"), &Directory::rename);
|
||||
|
||||
Reference in New Issue
Block a user