diff --git a/src/nnn.c b/src/nnn.c
index 117d329..facdc99 100644
--- a/src/nnn.c
+++ b/src/nnn.c
@@ -2502,7 +2502,7 @@ static int sum_sizes(const char *fpath, const struct stat *sb,
 	return 0;
 }
 
-static void dentfree(struct entry *dents)
+static void dentfree(void)
 {
 	free(pnamebuf);
 	free(dents);
@@ -2683,7 +2683,7 @@ static int dentfill(char *path, struct entry **dents)
 
 	/* Should never be null */
 	if (closedir(dirp) == -1) {
-		dentfree(*dents);
+		dentfree();
 		errexit();
 	}
 
@@ -2883,6 +2883,8 @@ static void browse(char *ipath)
 	char *dir, *tmp;
 	char *scriptpath = getenv(env_cfg[NNN_SCRIPT]);
 
+	atexit(dentfree);
+
 	/* setup first context */
 	xstrlcpy(g_ctx[0].c_path, ipath, PATH_MAX); /* current directory */
 	path = g_ctx[0].c_path;
@@ -2895,15 +2897,13 @@ static void browse(char *ipath)
 	cfg.filtermode ?  (presel = FILTER) : (presel = 0);
 
 	dents = xrealloc(dents, total_dents * sizeof(struct entry));
-	if (dents == NULL)
+	if (!dents)
 		errexit();
 
 	/* Allocate buffer to hold names */
 	pnamebuf = (char *)xrealloc(pnamebuf, NAMEBUF_INCR);
-	if (pnamebuf == NULL) {
-		free(dents);
+	if (!pnamebuf)
 		errexit();
-	}
 
 begin:
 #ifdef LINUX_INOTIFY
@@ -3027,8 +3027,6 @@ nochange:
 					r = mkpath(path, dents[cur].name, newpath);
 					appendfpath(newpath, r);
 					writecp(pcopybuf, copybufpos - 1);
-
-					dentfree(dents);
 					return;
 				}
 
@@ -3920,8 +3918,6 @@ nochange:
 					goto nochange;
 				}
 			}
-
-			dentfree(dents);
 			return;
 		case SEL_QUITCTX:
 			fd = cfg.curctx;
@@ -3942,8 +3938,6 @@ nochange:
 				setdirwatch();
 				goto begin;
 			}
-
-			dentfree(dents);
 			return;
 		default:
 			if (xlines != LINES || xcols != COLS) {