diff --git a/src/box/index.cc b/src/box/index.cc
index 3058e668a50ee41b75a94ce792a1d3e73710e187..74eeeaa3ad8719db35d5f6345544125998e3f541 100644
--- a/src/box/index.cc
+++ b/src/box/index.cc
@@ -603,6 +603,26 @@ index_delete(struct index *index)
 	index_def_delete(def);
 }
 
+int
+index_read_view_create(struct index_read_view *rv,
+		       const struct index_read_view_vtab *vtab,
+		       struct index_def *def)
+{
+	rv->vtab = vtab;
+	rv->def = index_def_dup(def);
+	if (rv->def == NULL)
+		return -1;
+	return 0;
+}
+
+void
+index_read_view_delete(struct index_read_view *rv)
+{
+	struct index_def *def = rv->def;
+	rv->vtab->free(rv);
+	index_def_delete(def);
+}
+
 /* }}} */
 
 /* {{{ Virtual method stubs */
diff --git a/src/box/index.h b/src/box/index.h
index 8a392b67a0c01cccceaf5dbfef872764ee6a907b..b3f5e79a5c7bcb45e4bc3f74cb588202ff659a39 100644
--- a/src/box/index.h
+++ b/src/box/index.h
@@ -571,6 +571,8 @@ struct index_read_view_vtab {
 struct index_read_view {
 	/** Virtual function table. */
 	const struct index_read_view_vtab *vtab;
+	/** Copy of the index definition. */
+	struct index_def *def;
 };
 
 /** Iterator over an index read view. */
@@ -821,11 +823,18 @@ index_end_build(struct index *index)
 	index->vtab->end_build(index);
 }
 
-static inline void
-index_read_view_delete(struct index_read_view *rv)
-{
-	rv->vtab->free(rv);
-}
+/**
+ * Initialize an index read view instance.
+ * Note, this function copies the given index definition.
+ */
+int
+index_read_view_create(struct index_read_view *rv,
+		       const struct index_read_view_vtab *vtab,
+		       struct index_def *def);
+
+/** Free an index read view instance. */
+void
+index_read_view_delete(struct index_read_view *rv);
 
 static inline struct index_read_view_iterator *
 index_read_view_create_iterator(struct index_read_view *rv,
diff --git a/src/box/memtx_hash.cc b/src/box/memtx_hash.cc
index 25f6fd32cd567244aa84c2f28c68c1a246a7d516..3c3b6660754433384cfe34388a25d78f130d43da 100644
--- a/src/box/memtx_hash.cc
+++ b/src/box/memtx_hash.cc
@@ -562,9 +562,12 @@ memtx_hash_index_create_read_view(struct index *base)
 	struct memtx_hash_index *index = (struct memtx_hash_index *)base;
 	struct hash_read_view *rv =
 		(struct hash_read_view *)xmalloc(sizeof(*rv));
+	if (index_read_view_create(&rv->base, &vtab, base->def) != 0) {
+		free(rv);
+		return NULL;
+	}
 	struct space *space = space_cache_find(base->def->space_id);
 	memtx_tx_snapshot_cleaner_create(&rv->cleaner, space);
-	rv->base.vtab = &vtab;
 	rv->index = index;
 	index_ref(base);
 	light_index_view_create(&rv->view, &index->hash_table);
diff --git a/src/box/memtx_tree.cc b/src/box/memtx_tree.cc
index 02c5e24c503a541b23c241f56512d92ed704a78b..9c5dddb059e4242a8156ed8193c24119e7f31ddd 100644
--- a/src/box/memtx_tree.cc
+++ b/src/box/memtx_tree.cc
@@ -1782,9 +1782,12 @@ memtx_tree_index_create_read_view(struct index *base)
 		(struct memtx_tree_index<USE_HINT> *)base;
 	struct tree_read_view<USE_HINT> *rv =
 		(struct tree_read_view<USE_HINT> *)xmalloc(sizeof(*rv));
+	if (index_read_view_create(&rv->base, &vtab, base->def) != 0) {
+		free(rv);
+		return NULL;
+	}
 	struct space *space = space_cache_find(base->def->space_id);
 	memtx_tx_snapshot_cleaner_create(&rv->cleaner, space);
-	rv->base.vtab = &vtab;
 	rv->index = index;
 	index_ref(base);
 	memtx_tree_view_create(&rv->tree_view, &index->tree);
diff --git a/src/box/sequence.c b/src/box/sequence.c
index f6eefd4bc1bafc571fc2bad412e0fd4e49d7b5f7..9db36fe7c313facb389428c83f4f61e8841e1da5 100644
--- a/src/box/sequence.c
+++ b/src/box/sequence.c
@@ -396,7 +396,10 @@ sequence_data_read_view_create(struct index *index)
 		.create_iterator = sequence_data_iterator_create,
 	};
 	struct sequence_data_read_view *rv = xmalloc(sizeof(*rv));
-	rv->base.vtab = &vtab;
+	if (index_read_view_create(&rv->base, &vtab, index->def) != 0) {
+		free(rv);
+		return NULL;
+	}
 	light_sequence_view_create(&rv->view, &sequence_data_index);
 	return (struct index_read_view *)rv;
 }