0

我有一个类,它有一个private在构造函数的堆上声明的成员。然后,在析构函数中,它是deleteed。现在,我想添加一个方法来修改该变量。我希望能够使用参考,但我不确定所涉及的内存的细节,我想知道我做得正确(该项目在内存部门可能相当大)。

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

// method to modify str.
};

如果我通过引用传递,我应该采取哪些步骤来消除内存泄漏并最大限度地减少内存使用?话虽如此,我还不想对优化那么激进。

我应该如何为堆上的成员编写我的 getter 和 setter?复制构造函数,还有别的吗?

4

2 回答 2

4

你把你的问题复杂化了。代码应如下所示:

class A
{
    private: std::string str;

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

构造函数正在使用空字符串初始化您的数据成员。您不需要任何析构函数。字符串类将为您完成所有清理工作。您可以像上面的示例方法一样使用您的数据字段。

不要添加任何特殊的复制/移动方法。只需仔细阅读有关如何使用字符串类的手册。

于 2013-10-15T02:49:34.643 回答
2

首先,private: std::string str;应该是private: std::string* str;

您当前的内存管理模型是经典的 RIIA 模型。. 首先,有几个问题需要澄清。

  • 请问str对象是类独占的A吗?
  • 你想用str出类的生命周期A吗?

如果您对上述问题的回答为“否”,则该模型不太适合您的需求。

否则,你可以继续实现那些成员函数,这里我只是提供一些线索。

Getter 可以返回一个引用,

 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);
 }
于 2013-10-15T02:40:40.353 回答