gpt4 book ai didi

c++ - 给出了在 C++ 中返回对象的各种方法,这些 return 语句中的每一个的潜在问题是什么

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:57:14 24 4
gpt4 key购买 nike

下面是包含各种返回语句的代码,并且都运行良好。编译器针​​对 fun_ret_obj1 抛出警告

Test.cpp: In function ‘myClass& fun_ret_obj1()’: Test.cpp:45: warning: reference to local variable ‘myObj’ returned

但输出似乎还不错。是偶然的吗?下面的任何 return 语句是否有任何问题?
解释会很有帮助,谢谢

#include <iostream>
using namespace std;


class myClass {
public:
int a ;
myClass()
{
a = 10;
}
};
myClass& fun_ret_add()
{
myClass *ptr = new myClass();
return *ptr;
}

myClass* fun_ret_ptr()
{
myClass *ptr = new myClass();
return ptr ;
}

myClass fun_ret_obj()
{
myClass myObj;
return myObj;
}

myClass& fun_ret_obj1()
{
myClass myObj;
return myObj;
}


int main()
{
myClass obj,obj1;
std::cout <<"In Main \n";

myClass *a = fun_ret_ptr();
std::cout<<a->a<<"\n";

myClass &b = fun_ret_add();
std::cout<<b.a<<"\n";

myClass c = fun_ret_obj();
std::cout<<c.a<<"\n";

myClass d = fun_ret_obj1();
std::cout<<d.a<<"\n";

}

最佳答案

第一个是内存泄漏:

myClass& fun_ret_add()
{
myClass *ptr = new myClass();
return *ptr;
}

第二个返回原始指针(邪恶 - 返回 std::unique_ptr)

 myClass* fun_ret_ptr()
{
myClass *ptr = new myClass();
return ptr ;
}

第三个是完美的 - 返回一个拷贝,几乎总是会被省略。 在 c++17 中它保证被省略 。这是高效和安全的。

 myClass fun_ret_obj()
{
myClass myObj;
return myObj;
}

更新

在 c++17 中,您可以通过这种方式保证省略拷贝:

 myClass fun_ret_obj()
{
return myClass{};
}

更新结束

第四个是未定义的行为。返回对不存在的对象的引用。永远不要这样做。

 myClass& fun_ret_obj1()
{
myClass myObj;
return myObj;
}

关于内存泄漏

确实,在第一个示例中,调用者可以释放内存,如果他/她知道 myClass 已分配给 new:

auto& x = fun_ret_add();    // a
...
delete std::addressof(x); // b

这需要:

  1. 调用者知道 fun_ret_add() 是根据 new 实现的。
  2. fun_ret_add() 的实现永远不会改变
  3. 在 (a) 和 (b) 之间没有出现异常

第二个例子类似。在这种情况下,至少有一个对象需要被删除的提示,但是调用者仍然必须知道该对象已经分配了new,并且他必须防止异常。

与此对比:

std::unique_ptr<myClass> fun_ret_ptr()
{
return std::make_unique<myClass>();
// or
return { new myClass() };
// or
return std::unique_ptr<myClass>(new myClass());
}

现在调用者收到一个智能指针。如果调用者只使用这个指针,当指针超出范围时,myClass 对象将被正确删除,所有内存将被回收。

关于c++ - 给出了在 C++ 中返回对象的各种方法,这些 return 语句中的每一个的潜在问题是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39491324/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com