2013-09-27 1 views
4

В прошлом я всегда создал карту, как это:Правильное использование станд :: карта в качестве члена класса

class TestClass 
{ 
    private: 
     std::map<int,int> *mapA; 
}; 

TestClass::TestClass 
{ 
    mapA = new std::map<int,int>(); 
} 

TestClass::~TestClass 
{ 
    mapA->clear(); // not necessary 
    delete mapA; 
} 

Итак, теперь я читаю повсюду в Stackoverflow: ИЗБЕЖАТЬ указатели как можно чаще

В настоящее время я хочу создать карту без указателя и новой (нет необходимости удалять объект самостоятельно и меньше опасности получить утечку памяти)!

class TestClass 
{ 
    public: 
     TestClass() : mapA() // this is also needed? 
     {}; 
    private: 
     std::map<int,int> mapA; 
}; 

Какие-либо дальнейшие шаги для правильного создания карты необходимо?

Благодарим за помощь и/или разъяснение!

+1

Я только что заметил, что вы отредактировали в mapA-> clear() свой исходный деструктор. Это не обязательно - карта будет очищаться во время деконструкции. – zennehoy

+0

Вам не нужно называть 'map :: clear' в любом случае. – Ajay

ответ

6

Нет, это не так, и вам не нужно явно инициализировать его в конструкторе.

+1

Я всегда удивляюсь, что хотя код без указаний * намного проще, чем код указателя, новички всегда, кажется, идут на версию указателя. – john

+0

@john Возможно, это не так; только те, кто идет за указателем, попадают в беду, и мы их замечаем. – Gorpik

+0

@john Часто люди переходят с Java, и, поскольку вам нужно все новое в Java, они делают то же самое в C++. –

3

Как говорит zennehoy, нет необходимости инициализировать карту в конструкторе TestClass. Позвольте мне отметить разницу между этими двумя реализациями:

В первой, TestClass, как это в настоящее время написано, не копируемыми без нежелательных эффектов, потому что сырой указатель на динамически распределяемой карте копируется:

TestClass *A = new TestClass;  // A has a map 
TestClass *B = new TestClass(A); // B shares the map with A! 

delete A; // this deletes A's map (in destructor) 
delete B; // this deletes A's map again! wrong 

В вашей второй реализации это не происходит, потому что карта, а не только ее адрес, полностью копируется.

Для решения этой проблемы в вашей первой реализации вы должны использовать общий указатель или самостоятельно выполнить эту работу, выполнив команду operator= и конструктор копирования. Или, если вы хотите по-настоящему поделиться картой между копируемыми экземплярами, вы должны реализовать механизм подсчета ссылок.

Смежные вопросы