О владении объектами кучи и C ++ и параметрами передачи по ссылке

Я бы хотел, чтобы мой класс был:

class NumberedString : public Object {
public:
    String newName;
    short nameID;
    NumberedString(String &newName, short nameID) : newName(newName), nameID(nameID) {}
};

HashMap uniqueStrs;//For later.

Его экземпляр будет передан в HashMap , который берет на себя право владения своим распределением кучи:

В HashMap.h (скажем):

virtual result Add(const Object& key, const Object& value);

Вот здесь я запутался. Я выделял String в строке, которая называла Добавьте :

uniqueStrs.Add(*(new String(L"XYX_say")), *pNewLoc);

HashMap затем освободит эту память для меня, несмотря на то, что я принял только ссылку на нее. Может быть, я потерял десять лет до C за новое тысячелетие, но я думал, что это невозможно?

Если это не так, тогда я мог бы написать что-то вроде:

~NumberedString() {
    delete &newName;
}

для своего класса, но я бы никогда не догадался, если бы не увидел эту библиотеку HashMap :: RemoveAll () , выполняя аналогичные действия. В этом вопросе говорится, что это невозможно, но приходится полагаться на auto_ptr и shared_ptr , но моя «платформа поддерживает только STL (Standar d Библиотека шаблонов ( http://www.sgi.com/tech/stl/ )). »(из всей« Стандартной библиотеки C ++ »). Могли бы все ответы воздержаться от таких ссылок.

Спасибо.

ССЫЛКИ, подсказанные комментариями

Я не могу публиковать ссылки в качестве комментариев, поэтому просмотрите метод Добавить и пример его предлагаемого использования: здесь И Бендж, Строка не является std :: string нет, извините.

ТАКЖЕ

Я знаю, что это может вызвать сбои при попытке удалить объекты стека, но я не понимаю, как HashMap может утверждать, что может удалять объекты кучи. Я закодировал приведенный выше класс, чтобы попытаться воссоздать это поведение, но я не могу совершить подвиг, отсюда и вопрос.

В ответ на «Бесполезно»

@Useless: Возможно, нельзя передать в foo (int & bar) переменную * pBar , объявленную int pBar = new int (1); , а затем foo принимает владение с

foo(int &bar) {
    int *__pBar = &bar;
    delete __pBar;
}

? Я собирался попробовать, но начинаю проявлять осторожность, чтобы не верить слишком многому из того, что говорится в документации. Хотя он был сгенерирован из заголовка, который говорит

class _EXPORT_BASE_ HashMap :
    public IMap,
    public Object
    {
    virtual result Add(const Object& key, const Object& value);
        //other stuff
    };

0
задан Community 23 May 2017 в 12:27
поделиться