# HG changeset patch # User František Kučera # Date 1537051362 -7200 # Node ID 019edca46769e9dbc6db69951f678cd73d1deb39 # Parent fc0d05b722147236a9c36fa21d82db39717f606d AttributeMetadata: use smart pointer and avoid memory-leak diff -r fc0d05b72214 -r 019edca46769 include/relpipe/reader/handlers/AttributeMetadata.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 + #include "../TypeId.h" namespace relpipe { @@ -10,11 +12,10 @@ class AttributeMetadata { private: - AttributeMetadataPrivate* impl; + std::shared_ptr impl; public: - ~AttributeMetadata(); - AttributeMetadata(AttributeMetadataPrivate* impl) : + AttributeMetadata(std::shared_ptr impl) : impl(impl) { } diff -r fc0d05b72214 -r 019edca46769 src/AttributeMetadataPrivate.h --- 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; } diff -r fc0d05b72214 -r 019edca46769 src/StreamRelationalReader.h --- 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 #include +#include #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 columnTypes; std::vector columnNames; - std::vector columns; + std::vector 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(new AttributeMetadataPrivate({columnNames[i], columnTypes[i], typeCode}))); } for (StringHandler* handler : stringHandlers) handler->startRelation(tableName, columns);