在c ++中通过引用返回堆块

时间:2013-11-04 07:28:16

标签: c++ return-type

我试图提高我的c ++技能。 我有两个功能:

concat_HeapVal()按值
返回输出堆变量 concat_HeapRef()通过引用

返回输出堆变量

当main()运行时,它将在堆栈上,s1和s2将在堆栈中, 我只通过ref传递值,在下面的每个函数中,我在堆上创建一个变量并将它们连接起来。

当调用concat_HeapVal()时,它会返回正确的输出 当调用concat_HeapRef()时,它会返回一些内存地址(输出错误)。为什么呢?

我在两个函数中都使用new运算符。因此它在堆上分配 因此,当我通过引用返回时,即使我的main()堆栈内存超出范围,堆仍将是VALID。

因此,操作系统需要清理内存。正确?

string& concat_HeapRef(const string& s1, const string& s2)
{

    string *temp = new string();
    temp->append(s1);

    temp->append(s2);
    return *temp;
}


string* concat_HeapVal(const string& s1, const string& s2)
{

    string *temp = new string();
    temp->append(s1);

    temp->append(s2);
    return temp;

}

int main()

{

    string s1,s2;
    string heapOPRef;
    string *heapOPVal;
    cout<<"String Conact Experimentations\n";
    cout<<"Enter s-1 : ";
    cin>>s1;
    cout<<"Enter s-2 : ";

    cin>>s2;

    heapOPRef = concat_HeapRef(s1,s2);
    heapOPVal = concat_HeapVal(s1,s2);

    cout<<heapOPRef<<"  "<<heapOPVal<<" "<<endl;
        return -9;
}

3 个答案:

答案 0 :(得分:2)

除了你以后从这两个函数中泄漏免费商店对象之外,你的两个函数都是合法的和精细的。

第一个函数返回对free store上的值的引用,该值被复制到main中的本地变量中。 第二个函数返回一个指向免费存储上的实例的指针,该指针存储在main中的指针变量中。

你的问题在于你不打印第二个字符串,你打印它的地址,这要归功于有一个运算符&lt;&lt;打印指针包含的地址作为数字。

如果您打算访问第二个变量的内容,则应在使用时取消引用它。

答案 1 :(得分:1)

当您通过引用返回时,您表示(除其他事项外)调用者不会成为数据的所有者,并且不负责释放数据。

您已经分配了新的块,并且唯一剩下的引用就是您返回的那个。所以它不能通过引用。

但它不适用于所有堆分配的块。如果你有堆分配的块,你在成员变量中保存指针,以便稍后释放,例如在析构函数中,您可能并且经常会通过引用将其返回。


但实际上,指向std::string的指针是代码气味。 std::string大部分时间都应按按值返回。这是stringstring *是指针,而不是值。

答案 2 :(得分:0)

  

因此,操作系统需要清理内存。正确?

右。

你泄漏了内存。

当您的流程结束时,您的操作系统将拥有来回收内存本身,或者在断电之前它将保持分配状态。

请不要这样做。

立即停止使用new:只需创建一个友好的新std::string对象并将其返回。让编译器的优化和/或移动语义对所有内容进行排序。