У меня есть класс, который имеет private
член, который объявляется в куче в конструкторе. Затем, в деструкторе, он delete
ed. Теперь я хотел бы добавить метод для изменения этой переменной. Я хотел бы иметь возможность использовать ссылку, но я не уверен в специфике используемой памяти, и я хотел бы знать, что я делаю это правильно (проект может быть довольно большим в отделе памяти).
class A
{
private: std::string str;
/* ... */
public:
A()
{
str = new std::string("");
}
~A(){delete str;}
// method to modify str.
};
Если я пройду по ссылке, какие шаги следует предпринять для устранения утечек памяти и минимизации использования памяти? При этом я не хочу, чтобы все это было оптимистично с оптимизацией.
Как я должен писать свои получатели и сеттеры для члена, который находится в куче? Копировать конструкторы, что-то еще?
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);
}
Вы слишком усложняете свою проблему. Код должен выглядеть так:
class A
{
private: std::string str;
public:
A() { str = ""; }
std::string GetStr() { return str; }
void SetStr(std::string value) { str = value; }
};
Конструктор инициализирует ваш элемент данных пустой строкой. Вам не нужен деструктор. Класс string выполнит всю очистку для вас. И вы можете использовать свое поле данных, как в приведенных выше методах.
Не добавляйте специальные методы копирования/перемещения. Просто внимательно прочитайте руководство по использованию класса строк.
std::string
уже инициализирует его пустой строкой.