我正在尝试在堆上创建一个对象,然后从调用函数传回它的地址,但我无法让它工作!
如果从main调用此函数,为什么我不能将对象的地址存储在新指针中?
Feline newFeline(int height, int weight) {
Feline *myFeline = new Feline(height, weight);
return *myFeline;
}
int main()
{
Feline *f2;
*f2 = newFeline(10, 100);
//cout << f2->getHeight() << endl;
return 0;
}
当我运行它时,我得到一个总线错误:10。哦,我确实喜欢猫。
答案 0 :(得分:5)
更改函数的签名以返回指针,并按值返回指针
Feline* newFeline(int height, int weight)
{
Feline *myFeline = new Feline(height, weight);
return myFeline;
}
按照目前的说法,您按值返回Feline
,然后立即泄漏您使用Feline
分配的new
。
答案 1 :(得分:4)
您的代码存在多个问题。
首先,newFeline函数将返回一个临时的Feline。并且该方法本身具有内存泄漏(分配的Feline未被释放)。通常,临时将在调用newFeline函数的语句后消失。
其次,您正在填写f2当前指向的内存内容。但f2未初始化,因此它指向随机存储器地址。将临时Feline复制到此内存地址会导致应用程序崩溃。
要解决这个问题,你需要更改newFeline,以便它返回分配的猫科动物的地址,而不是它的副本,如下所示:
Feline *newFeline(int height, int weight) {
Feline *myFeline = new Feline(height, weight);
return myFeline;
}
其次,让f2指向newFeline的返回值,而不是改变f2的内容,如下所示:
Feline *f2;
f2 = newFeline(10, 100);
最好是将它写在一行上,如下所示:
Feline *f2 = newFeline(10, 100);
或使用C ++ 11 auto关键字:
auto f2 = newFeline(10,100);
为了防止内存泄漏,让newFeline将unique_ptr返回给Feline会更好,如下所示:
std::unique_ptr<Feline> newFeline(int height, int weight) {
Feline *myFeline = new Feline(height, weight);
return myFeline;
}
这样,f2(如果使用auto)也将成为unique_ptr,当f2超出范围时,分配的猫科动物将被自动删除。
答案 2 :(得分:1)
尝试使用它,即从函数返回一个指针:
Feline* newFeline(int height, int weight)
{
Feline *myFeline = new Feline(height, weight);
return myFeline;
}
答案 3 :(得分:1)
您的代码非常脆弱。要编译它,您可以尝试以下方法:
Feline newFeline(int height, int weight)
{
Feline *myFeline = new Feline(height, weight);
return *myFeline;
}
int main()
{
Feline f2;
f2 = newFeline(10, 100);
}
然而,这会泄漏内存并假定可以复制Feline
个对象。
在这种情况下,我只需直接调用Feline
的构造函数,而不是使用任何指针或单独的函数。
int main()
{
Feline f2(10, 100);
}
如果您确实想要从函数返回它,如果Feline
支持复制而您没有使用多态类型,则可以使用以下内容:
Feline newFeline(int height, int weight)
{
Feline myFeline(height, weight);
return myFeline;
}
int main()
{
Feline f2 = newFeline(10, 100);
}
但是如果将此函数的结果复制到Feline
的基类中,您将获得对象切片。
如果这是一个问题,那么我建议您使用智能指针。
std::unique_ptr<Feline> newFeline(int height, int weight)
{
std::unique_ptr<Feline> myFeline(new Feline(height, weight));
return myFeline;
}
int main()
{
std::unique_ptr<Feline> f2 = newFeline(10, 100);
f2->do_stuff();
}