我有一个类,它在构造函数的堆上声明了private
成员。然后,在析构函数中,它是delete
ed。现在,我想添加一个方法来修改该变量。我希望能够使用引用,但我不确定所涉及的内存的细节,我想知道我正确地做了(项目在内存部门可能相当大) )。
class A
{
private: std::string str;
/* ... */
public:
A()
{
str = new std::string("");
}
~A(){delete str;}
// method to modify str.
};
如果我通过引用传递,我应采取哪些步骤来消除内存泄漏并最大限度地减少内存使用?话虽这么说,但我不想成为那些在优化方面具有侵略性的人。
我应该如何为堆上的成员编写我的getter和setter?复制构造函数,还有什么?
答案 0 :(得分:4)
你的问题太复杂了。代码应如下所示:
class A
{
private: std::string str;
public:
A() { str = ""; }
std::string GetStr() { return str; }
void SetStr(std::string value) { str = value; }
};
构造函数使用空字符串初始化数据成员。你不需要任何破坏者。字符串类将为您完成所有清理工作。您可以像上面的示例方法一样使用您的数据字段。
不要添加任何特殊的复制/移动方法。只需仔细阅读有关如何使用字符串类的手册。
答案 1 :(得分:2)
首先,private: std::string str;
应为private: std::string* str;
您当前的内存管理模型是classic RIIA model.。首先,有几个问题需要澄清。
str
对象是否仅归班级A
所有? str
的生命周期内使用A
吗?如果您对上述情况回答“否”,则此模型不能很好地满足您的需求。
否则,你可以继续实现这些成员函数,在这里我只是提供一些线索。
Getters可以返回一个引用,
std::string const& getStr() {
return *str;
}
Setter只能更改值
void setStr(std::string const& s){
*str = s;
}
对于复制构造函数,您只需从std::string
调用复制构造函数并进行深层复制,
A(A const& obj){
str = new std::string(*obj.str);
}