1

我正在学校学习 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 对象,但我很好奇,好像我必须返回 temp char

管理您还希望按值返回的动态本地内存的常用/正确方法是什么?

4

1 回答 1

1

是的 - 您的代码中存在内存泄漏,您分配内存然后可能在下一行返回不同的值。

使用封装帮助用户了解任何分配的生命周期;要么使用 std::shared_ptr 之类的东西,要么创建一个包装分配所有权的类。

于 2013-06-01T03:23:11.510 回答