参数:他们在哪里宣布?

时间:2013-10-15 02:32:16

标签: c++ memory-management memory-leaks

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

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

// method to modify str.
};

如果我通过引用传递,我应采取哪些步骤来消除内存泄漏并最大限度地减少内存使用?话虽这么说,但我不想成为那些在优化方面具有侵略性的人。

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

2 个答案:

答案 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);
 }
相关问题