C ++返回本地分配的动态内存而不泄漏?

时间:2013-06-01 00:49:34

标签: c++ memory-management operator-overloading

我在学校学习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对象,但我很好奇,好像我要返回临时字符

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

1 个答案:

答案 0 :(得分:1)

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

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