AttributeMetadata: use smart pointer and avoid memory-leak v_0
authorFrantišek Kučera <franta-hg@frantovo.cz>
Sun, 16 Sep 2018 00:42:42 +0200
branchv_0
changeset 26 019edca46769
parent 25 fc0d05b72214
child 27 ac99d74af1f1
AttributeMetadata: use smart pointer and avoid memory-leak
include/relpipe/reader/handlers/AttributeMetadata.h
src/AttributeMetadataPrivate.h
src/StreamRelationalReader.h
--- a/include/relpipe/reader/handlers/AttributeMetadata.h	Sat Sep 15 23:22:50 2018 +0200
+++ b/include/relpipe/reader/handlers/AttributeMetadata.h	Sun Sep 16 00:42:42 2018 +0200
@@ -1,5 +1,7 @@
 #pragma once
 
+#include <memory>
+
 #include "../TypeId.h"
 
 namespace relpipe {
@@ -10,11 +12,10 @@
 
 class AttributeMetadata {
 private:
-	AttributeMetadataPrivate* impl;
+	std::shared_ptr<AttributeMetadataPrivate> impl;
 public:
-	~AttributeMetadata();
 
-	AttributeMetadata(AttributeMetadataPrivate* impl) :
+	AttributeMetadata(std::shared_ptr<AttributeMetadataPrivate> impl) :
 	impl(impl) {
 	}
 
--- a/src/AttributeMetadataPrivate.h	Sat Sep 15 23:22:50 2018 +0200
+++ b/src/AttributeMetadataPrivate.h	Sun Sep 16 00:42:42 2018 +0200
@@ -15,11 +15,6 @@
 	string_t typeName;
 };
 
-AttributeMetadata::~AttributeMetadata() {
-	// delete impl;
-	std::cout << "FIXME: delete impl in ~AttributeMetadata() but no double-delete / smart pointer" << std::endl;
-}
-
 string_t AttributeMetadata::getAttributeName() const {
 	return impl->attributeName;
 }
--- a/src/StreamRelationalReader.h	Sat Sep 15 23:22:50 2018 +0200
+++ b/src/StreamRelationalReader.h	Sun Sep 16 00:42:42 2018 +0200
@@ -5,6 +5,7 @@
 #include <vector>
 
 #include <relpipe/protocol/constants.h>
+#include <memory>
 
 #include "../include/relpipe/reader/typedefs.h"
 #include "../include/relpipe/reader/RelationalReader.h"
@@ -25,6 +26,8 @@
 
 using StringHandler = relpipe::reader::handlers::RelationalReaderStringHadler;
 using ValuesHandler = relpipe::reader::handlers::RelationalReaderValueHadler;
+using AttributeMetadata = relpipe::reader::handlers::AttributeMetadata;
+using AttributeMetadataPrivate = relpipe::reader::handlers::AttributeMetadataPrivate;
 
 class StreamRelationalReader : public RelationalReader {
 private:
@@ -51,7 +54,7 @@
 	 */
 	std::vector<TypeId> columnTypes;
 	std::vector<string_t> columnNames;
-	std::vector<handlers::AttributeMetadata> columns;
+	std::vector<AttributeMetadata> columns;
 
 	/**
 	 * TODO: remove?
@@ -158,7 +161,7 @@
 					columnTypes.push_back(typeId);
 
 					// put together names, type ids and type codes:
-					columns.push_back(handlers::AttributeMetadata(new handlers::AttributeMetadataPrivate({columnNames[i], columnTypes[i], typeCode})));
+					columns.push_back(std::shared_ptr<AttributeMetadataPrivate>(new AttributeMetadataPrivate({columnNames[i], columnTypes[i], typeCode})));
 				}
 
 				for (StringHandler* handler : stringHandlers) handler->startRelation(tableName, columns);