对于我的家庭作业,我需要用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];
}
答案 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::_str
是char *
保存数据的主指针。
因此,在分配conc。
之前,必须考虑将数组删除到_str
delete[] _str;
_str = conc;
另外,你最好考虑像concatenate(const String &)
这样的连接方法的参数。