diff --git a/src/backend/storage/lmgr/lwlock.c b/src/backend/storage/lmgr/lwlock.c
index 46c82c63ca5..527bd85c1f7 100644
--- a/src/backend/storage/lmgr/lwlock.c
+++ b/src/backend/storage/lmgr/lwlock.c
@@ -192,6 +192,9 @@ typedef struct NamedLWLockTrancheRequest
 int			NamedLWLockTrancheRequests = 0;
 NamedLWLockTrancheRequest *NamedLWLockTrancheRequestArray = NULL;
 
+/* postmaster's local copy of the request array */
+static NamedLWLockTrancheRequest *LocalNamedLWLockTrancheRequestArray = NULL;
+
 /* shared memory counter of registered tranches */
 int		   *LWLockCounter = NULL;
 
@@ -396,6 +399,15 @@ LWLockShmemSize(void)
 	Size		size;
 	int			numLocks = NUM_FIXED_LWLOCKS;
 
+	/*
+	 * If re-initializing shared memory, the request array will no longer be
+	 * accessible, so switch to the copy that was stowed away in postmaster's
+	 * local memory.  We'll copy it back into shared memory later when
+	 * CreateLWLocks() is called again.
+	 */
+	if (LocalNamedLWLockTrancheRequestArray)
+		NamedLWLockTrancheRequestArray = LocalNamedLWLockTrancheRequestArray;
+
 	/* Calculate total number of locks needed in the main array. */
 	numLocks += NumLWLocksForNamedTranches();
 
@@ -457,9 +469,15 @@ CreateLWLocks(void)
 		 */
 		if (NamedLWLockTrancheRequests > 0)
 		{
+			/*
+			 * Save the pointer to the request array in postmaster's local
+			 * memory.  We'll need it if we ever need to re-initialize shared
+			 * memory after a crash.
+			 */
+			LocalNamedLWLockTrancheRequestArray = NamedLWLockTrancheRequestArray;
+
 			memcpy(ptr, NamedLWLockTrancheRequestArray,
 				   NamedLWLockTrancheRequests * sizeof(NamedLWLockTrancheRequest));
-			pfree(NamedLWLockTrancheRequestArray);
 			NamedLWLockTrancheRequestArray = (NamedLWLockTrancheRequest *) ptr;
 			ptr += NamedLWLockTrancheRequests * sizeof(NamedLWLockTrancheRequest);
 		}
-- 
2.39.5 (Apple Git-154)
