如何在我的方法中避免内存泄漏?

时间:2012-02-11 19:21:31

标签: c++

对于我的家庭作业,我需要用C ++编写String对象。

其中一种方法是

void concatenate(String *s)

但是当我用Valgrind检查我的对象时,我的代码中存在内存泄漏。方法是:

// add s's str to this _str
void String::concatenate(String *s)
{
  char * conc;
  int conc_size, i, j;

  conc_size = _len + s->_len;

  conc = new char[conc_size];  // line 39

  for (i = 0; i < _len; i++)
    conc[i] = _str[i];

  for (j = 0; i < conc_size || j < s->_len; i++, j++)
    conc[i] = s->_str[j];

  _str = conc;   // i'm assuming the problem is here
  _len = conc_size;
}

这是Valgrind消息:

==4706== 3 bytes in 1 blocks are definitely lost in loss record 2 of 9
==4706==    at 0x100024679: malloc (vg_replace_malloc.c:266)
==4706==    by 0x10007BF04: operator new(unsigned long) (in /usr/lib/libstdc++.6.0.9.dylib)
==4706==    by 0x10007BF96: operator new[](unsigned long) (in /usr/lib/libstdc++.6.0.9.dylib)
==4706==    by 0x100000E7E: String::concatenate(String*) (String.cpp:39)
==4706==    by 0x100001479: main (main.cpp:27)

使用delete [] _str;并更改构造函数:

// the empty string.
String::String()
{
    _len = 1;

    _str = new char[_len];
    assert(_str);
    _str[0] = '\0';
}

// store s string in this
String::String(char *s)
{
    _len = 0;

    int i = 0;
    while(s[i] != '\0')
    {
        _len++;
        i++;
    }

    _str = new char[_len];
    assert(_str);

    for (i = 0; s[i] != '\0' && i < _len; i++)
        _str[i] = s[i];

}

6 个答案:

答案 0 :(得分:4)

您不是在处理会员_str的先前内容。我假设那也是char*。因此,当你告诉_str指向其他地方时,它之前指向的记忆将是不可能的。

delete[] _str;
_str = conc;

答案 1 :(得分:1)

行前

_str = conc;

 delete[] _str;

答案 2 :(得分:1)

你是对的,你用一个新指针覆盖你的内部指针而不删除它。

答案 3 :(得分:1)

你为什么不delete[] _str?现在正在晃来晃去。

答案 4 :(得分:0)

您的假设是正确的:您为_str指针分配了一个新值,但为其分配的内存仍然是分配的。您需要在该行之前调用delete[] _str;以释放内存。

答案 5 :(得分:0)

我假设String::_strchar *保存数据的主指针。

因此,在分配conc。

之前,必须考虑将数组删除到_str
delete[] _str;
_str = conc;

另外,你最好考虑像concatenate(const String &)这样的连接方法的参数。