我在学校学习C ++并为作业创建一个字符串类。我有几个问题:
首先,以下是否会造成内存泄漏?
MyString operator() (int sliceStart, int sliceEnd) {
sliceStart = sliceStart%_len;
if(sliceStart < 0)
sliceStart = _len + sliceStart;
sliceEnd = sliceEnd%_len;
if(sliceEnd < 0)
sliceEnd = _len + sliceEnd;
char* temp = new char[_len + 1];
if(sliceStart == sliceEnd)
return *this;
int i;
if(sliceStart < sliceEnd)
for(i = 0; sliceStart < sliceEnd; ++sliceStart && ++i)
temp[i] = _str[sliceStart];
else if(sliceStart > sliceEnd) {
for(i = 0; sliceStart < _len; ++sliceStart && ++i)
temp[i] = _str[sliceStart];
for(int k = 0; k < sliceEnd; ++i && ++k)
temp[i] = _str[k];
}
temp[i] = '\0';
//delete [] temp
return MyString(temp);
}
如果是这样,添加注释删除行将返回有效值,因为它在返回之前被释放。或者是否有可能在两条线之间抢夺内存?
(我知道在这种特殊情况下我可以在返回之前简单地创建一个MyString对象,但我很好奇,好像我要返回临时字符)
管理您希望按值返回的动态本地内存的常用/正确方法是什么?
答案 0 :(得分:1)
是的 - 您的代码中存在内存泄漏,您分配内存,然后可能在下一行返回不同的值。
使用封装来帮助用户了解任何分配的生命周期;要么使用类似std :: shared_ptr的东西,要么创建一个包含分配所有权的类。