Параметры: где они объявлены?

0

У меня есть класс, который имеет private член, который объявляется в куче в конструкторе. Затем, в деструкторе, он delete ed. Теперь я хотел бы добавить метод для изменения этой переменной. Я хотел бы иметь возможность использовать ссылку, но я не уверен в специфике используемой памяти, и я хотел бы знать, что я делаю это правильно (проект может быть довольно большим в отделе памяти).

class A
{
private: std::string str;
/* ... */
public:
A() 
{
str = new std::string("");  
}
~A(){delete str;}

// method to modify str.
};

Если я пройду по ссылке, какие шаги следует предпринять для устранения утечек памяти и минимизации использования памяти? При этом я не хочу, чтобы все это было оптимистично с оптимизацией.

Как я должен писать свои получатели и сеттеры для члена, который находится в куче? Копировать конструкторы, что-то еще?

Теги:
memory-leaks
memory-management

2 ответа

2
Лучший ответ

first, private: std::string str; должен быть private: std::string* str;

ваша текущая модель управления памятью - классическая модель RIIA. , Во-первых, есть несколько вопросов, которые нужно очистить.

  • Будет ли объект str исключительно принадлежащим классу A?
  • вы хотите использовать str из жизни класса A?

Если вы ответите нет на вышесказанное, то эта модель не очень подходит для вашей потребности.

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

Getters может вернуть ссылку назад,

 std::string const& getStr() {
    return *str;
 }

Сеттер мог просто изменить значение,

 void setStr(std::string const& s){
    *str = s;
 }

Для конструктора копирования вы можете просто вызвать конструктор копирования из std::string и сделать глубокую копию,

 A(A const& obj){
    str = new std::string(*obj.str);
 }
  • 0
    Я думаю, что вики-страница RAII ужасна - гораздо лучшая ссылка будет informit.com/articles/article.aspx?p=30642&seqNum=8
  • 0
    хорошая ссылка, отредактировано.
Показать ещё 1 комментарий
4

Вы слишком усложняете свою проблему. Код должен выглядеть так:

class A
{
    private: std::string str;

    public:
        A() { str = ""; }
        std::string GetStr() { return str; }
        void SetStr(std::string value) { str = value; }
};

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

Не добавляйте специальные методы копирования/перемещения. Просто внимательно прочитайте руководство по использованию класса строк.

  • 1
    Конструктор по умолчанию для std::string уже инициализирует его пустой строкой.
  • 0
    Это правда. Я пытался быть ближе к исходному коду.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню