我试图提高我的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;
}
答案 0 :(得分:2)
除了你以后从这两个函数中泄漏免费商店对象之外,你的两个函数都是合法的和精细的。
第一个函数返回对free store上的值的引用,该值被复制到main中的本地变量中。 第二个函数返回一个指向免费存储上的实例的指针,该指针存储在main中的指针变量中。
你的问题在于你不打印第二个字符串,你打印它的地址,这要归功于有一个运算符&lt;&lt;打印指针包含的地址作为数字。
如果您打算访问第二个变量的内容,则应在使用时取消引用它。
答案 1 :(得分:1)
当您通过引用返回时,您表示(除其他事项外)调用者不会成为数据的所有者,并且不负责释放数据。
您已经分配了新的块,并且唯一剩下的引用就是您返回的那个。所以它不能通过引用。
但它不适用于所有堆分配的块。如果你有堆分配的块,你在成员变量中保存指针,以便稍后释放,例如在析构函数中,您可能并且经常会通过引用将其返回。
但实际上,指向std::string
的指针是代码气味。 std::string
大部分时间都应按string
,string *
是指针,而不是值。
答案 2 :(得分:0)
因此,操作系统需要清理内存。正确?
右。
你泄漏了内存。
当您的流程结束时,您的操作系统将拥有来回收内存本身,或者在断电之前它将保持分配状态。
请不要这样做。
立即停止使用new
:只需创建一个友好的新std::string
对象并将其返回。让编译器的优化和/或移动语义对所有内容进行排序。