问题是这样的:
|Conditional jump or move depends on uninitialised value(s)
| at 0x4A0A23B: strstr (mc_replace_strmem.c:1367)
| by 0x40123F: String::find(String const&, int) const (String.cpp:84)
| by 0x401C3A: main (StringTest.cpp:40)
| Uninitialised value was created by a heap allocation
| at 0x4A07192: operator new[](unsigned long) (vg_replace_malloc.c:363)
| by 0x401444: String::operator=(String const&) (String.cpp:118)
| by 0x401B62: main (StringTest.cpp:37)
|
提示告诉我们string.cpp:84依靠没初始化的变量进行条件判断
而这个变量是在String::operator=(String const&) 函数的这一行代码(String.cpp:118)出现的
我们看看这行代码:
memcpy(_buff, other._buff, _size);
这不科学!明明初始化了的!
再看看整段代码:
void String::operator=(const String &other) {
_length = other._length;
_size = other._size;
if (_buff != NULL) delete[] _buff;
_buff = new char[other._length + 1];
memset(_buff, 0, _size);
memcpy(_buff, other._buff, _size);
}
```
明明整个string的_size都初始化了的!
结果!!!!
最后终于发现了BUG!
这个memset没有全部memset!
_size = other._size;
其实不是全部的_size,有部分的被遗漏了!
改成
_size = (_length + 1) * sizeof(src[0]);
后过了!这说明,我们得到的_size 并不是真正的_size
启示
1.在两个对象间传递数据的时候,数据量越少越好!
2.初始化了但是被说没初始化的可能是没有全部初始化!
终于解决了,楼主的苦逼之情溢于言表!