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:
parent
259114e9e0
commit
768f9422bc
28 changed files with 154 additions and 259 deletions
|
|
@ -525,16 +525,14 @@ void FileSystemDock::_navigate_to_path(const String &p_path, bool p_select_in_fa
|
|||
if (target_path.ends_with("/")) {
|
||||
target_path = target_path.substr(0, target_path.length() - 1);
|
||||
}
|
||||
DirAccess *dirAccess = DirAccess::create(DirAccess::ACCESS_RESOURCES);
|
||||
if (dirAccess->file_exists(p_path)) {
|
||||
DirAccessRef da = DirAccess::create(DirAccess::ACCESS_RESOURCES);
|
||||
if (da->file_exists(p_path)) {
|
||||
path = target_path;
|
||||
} else if (dirAccess->dir_exists(p_path)) {
|
||||
} else if (da->dir_exists(p_path)) {
|
||||
path = target_path + "/";
|
||||
} else {
|
||||
memdelete(dirAccess);
|
||||
ERR_FAIL_MSG(vformat("Cannot navigate to '%s' as it has not been found in the file system!", p_path));
|
||||
}
|
||||
memdelete(dirAccess);
|
||||
}
|
||||
|
||||
_set_current_path_text(path);
|
||||
|
|
@ -1171,7 +1169,7 @@ void FileSystemDock::_try_move_item(const FileOrFolder &p_item, const String &p_
|
|||
_get_all_items_in_dir(EditorFileSystem::get_singleton()->get_filesystem_path(old_path), file_changed_paths, folder_changed_paths);
|
||||
}
|
||||
|
||||
DirAccess *da = DirAccess::create(DirAccess::ACCESS_RESOURCES);
|
||||
DirAccessRef da = DirAccess::create(DirAccess::ACCESS_RESOURCES);
|
||||
print_verbose("Moving " + old_path + " -> " + new_path);
|
||||
Error err = da->rename(old_path, new_path);
|
||||
if (err == OK) {
|
||||
|
|
@ -1211,7 +1209,6 @@ void FileSystemDock::_try_move_item(const FileOrFolder &p_item, const String &p_
|
|||
} else {
|
||||
EditorNode::get_singleton()->add_io_error(TTR("Error moving:") + "\n" + old_path + "\n");
|
||||
}
|
||||
memdelete(da);
|
||||
}
|
||||
|
||||
void FileSystemDock::_try_duplicate_item(const FileOrFolder &p_item, const String &p_new_path) const {
|
||||
|
|
@ -1230,7 +1227,7 @@ void FileSystemDock::_try_duplicate_item(const FileOrFolder &p_item, const Strin
|
|||
return;
|
||||
}
|
||||
|
||||
DirAccess *da = DirAccess::create(DirAccess::ACCESS_RESOURCES);
|
||||
DirAccessRef da = DirAccess::create(DirAccess::ACCESS_RESOURCES);
|
||||
print_verbose("Duplicating " + old_path + " -> " + new_path);
|
||||
Error err = p_item.is_file ? da->copy(old_path, new_path) : da->copy_dir(old_path, new_path);
|
||||
if (err == OK) {
|
||||
|
|
@ -1268,7 +1265,6 @@ void FileSystemDock::_try_duplicate_item(const FileOrFolder &p_item, const Strin
|
|||
} else {
|
||||
EditorNode::get_singleton()->add_io_error(TTR("Error duplicating:") + "\n" + old_path + "\n");
|
||||
}
|
||||
memdelete(da);
|
||||
}
|
||||
|
||||
void FileSystemDock::_update_resource_paths_after_move(const Map<String, String> &p_renames) const {
|
||||
|
|
@ -1418,12 +1414,11 @@ void FileSystemDock::_make_dir_confirm() {
|
|||
directory = directory.get_base_dir();
|
||||
}
|
||||
print_verbose("Making folder " + dir_name + " in " + directory);
|
||||
DirAccess *da = DirAccess::create(DirAccess::ACCESS_RESOURCES);
|
||||
DirAccessRef da = DirAccess::create(DirAccess::ACCESS_RESOURCES);
|
||||
Error err = da->change_dir(directory);
|
||||
if (err == OK) {
|
||||
err = da->make_dir(dir_name);
|
||||
}
|
||||
memdelete(da);
|
||||
|
||||
if (err == OK) {
|
||||
print_verbose("FileSystem: calling rescan.");
|
||||
|
|
@ -1464,13 +1459,11 @@ void FileSystemDock::_make_scene_confirm() {
|
|||
|
||||
scene_name = directory.plus_file(scene_name);
|
||||
|
||||
DirAccess *da = DirAccess::create(DirAccess::ACCESS_RESOURCES);
|
||||
DirAccessRef da = DirAccess::create(DirAccess::ACCESS_RESOURCES);
|
||||
if (da->file_exists(scene_name)) {
|
||||
EditorNode::get_singleton()->show_warning(TTR("A file or folder with this name already exists."));
|
||||
memdelete(da);
|
||||
return;
|
||||
}
|
||||
memdelete(da);
|
||||
|
||||
int idx = EditorNode::get_singleton()->new_scene();
|
||||
EditorNode::get_singleton()->get_editor_data().set_scene_path(idx, scene_name);
|
||||
|
|
@ -1533,7 +1526,7 @@ void FileSystemDock::_rename_operation_confirm() {
|
|||
}
|
||||
|
||||
// Present a more user friendly warning for name conflict.
|
||||
DirAccess *da = DirAccess::create(DirAccess::ACCESS_RESOURCES);
|
||||
DirAccessRef da = DirAccess::create(DirAccess::ACCESS_RESOURCES);
|
||||
#if defined(WINDOWS_ENABLED) || defined(UWP_ENABLED)
|
||||
// Workaround case insensitivity on Windows.
|
||||
if ((da->file_exists(new_path) || da->dir_exists(new_path)) && new_path.to_lower() != old_path.to_lower()) {
|
||||
|
|
@ -1541,10 +1534,8 @@ void FileSystemDock::_rename_operation_confirm() {
|
|||
if (da->file_exists(new_path) || da->dir_exists(new_path)) {
|
||||
#endif
|
||||
EditorNode::get_singleton()->show_warning(TTR("A file or folder with this name already exists."));
|
||||
memdelete(da);
|
||||
return;
|
||||
}
|
||||
memdelete(da);
|
||||
|
||||
Map<String, String> file_renames;
|
||||
Map<String, String> folder_renames;
|
||||
|
|
@ -1588,13 +1579,11 @@ void FileSystemDock::_duplicate_operation_confirm() {
|
|||
String new_path = base_dir.plus_file(new_name);
|
||||
|
||||
// Present a more user friendly warning for name conflict
|
||||
DirAccess *da = DirAccess::create(DirAccess::ACCESS_RESOURCES);
|
||||
DirAccessRef da = DirAccess::create(DirAccess::ACCESS_RESOURCES);
|
||||
if (da->file_exists(new_path) || da->dir_exists(new_path)) {
|
||||
EditorNode::get_singleton()->show_warning(TTR("A file or folder with this name already exists."));
|
||||
memdelete(da);
|
||||
return;
|
||||
}
|
||||
memdelete(da);
|
||||
|
||||
_try_duplicate_item(to_duplicate, new_path);
|
||||
|
||||
|
|
@ -2818,7 +2807,7 @@ void FileSystemDock::_get_imported_files(const String &p_path, Vector<String> &f
|
|||
return;
|
||||
}
|
||||
|
||||
DirAccess *da = DirAccess::open(p_path);
|
||||
DirAccessRef da = DirAccess::open(p_path);
|
||||
da->list_dir_begin();
|
||||
String n = da->get_next();
|
||||
while (!n.is_empty()) {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue