C++ 如何传递对象';从使用指针的函数获取堆上的地址
我试图在堆上创建一个对象,然后从调用函数传回它的地址,但我无法让它工作 如果这个函数是从main调用的,为什么我不能将对象的地址存储在一个新指针中C++ 如何传递对象';从使用指针的函数获取堆上的地址,c++,pointers,C++,Pointers,我试图在堆上创建一个对象,然后从调用函数传回它的地址,但我无法让它工作 如果这个函数是从main调用的,为什么我不能将对象的地址存储在一个新指针中 Feline newFeline(int height, int weight) { Feline *myFeline = new Feline(height, weight); return *myFeline; } int main() { Feline *f2; *f2 = newFeline(10, 100); //co
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;
}
猫科新猫科动物(身高、体重){
猫科动物*猫科动物=新的猫科动物(身高、体重);
返回*猫科动物;
}
int main()
{
猫*f2;
*f2=新猫(10100);
//cout getHeight()更改函数的签名以返回指针,然后按值返回指针
Feline* newFeline(int height, int weight)
{
Feline *myFeline = new Feline(height, weight);
return myFeline;
}
如当前所述,您按值返回一个猫
,然后立即泄漏分配给new
的猫
,尝试使用此ie,从函数返回指针:
Feline* newFeline(int height, int weight)
{
Feline *myFeline = new Feline(height, weight);
return myFeline;
}
您的代码非常脆弱。要将其编译,您可以尝试以下操作:
Feline newFeline(int height, int weight)
{
Feline *myFeline = new Feline(height, weight);
return *myFeline;
}
int main()
{
Feline f2;
f2 = newFeline(10, 100);
}
但是,这会泄漏内存,并假设猫科动物可以复制对象
在这种情况下,我只需直接调用猫的构造函数,而不使用任何指针或单独的函数
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();
}
std::独特的猫科动物(身高、体重)
{
性病:独特的猫科动物(新猫科动物(身高、体重));
返回猫科动物;
}
int main()
{
std::unique_ptr f2=新猫(10100);
f2->do_stuff();
}
您的代码存在多个问题
首先,newFeline函数将返回一个临时Feline。并且该方法本身存在内存泄漏(分配的Feline未被释放)。通常,临时将在调用newFeline函数的语句之后消失
int main()
{
Feline f2(10, 100);
}
其次,您正在填充f2当前指向的内存内容。但f2未初始化,因此它指向随机内存地址。将临时猫复制到此内存地址将导致应用程序崩溃
要解决此问题,您需要更改newFeline,使其返回分配的猫的地址,而不是其副本,如下所示:
Feline *newFeline(int height, int weight) {
Feline *myFeline = new Feline(height, weight);
return myFeline;
}
Feline *f2;
f2 = newFeline(10, 100);
Feline *f2 = newFeline(10, 100);
std::unique_ptr<Feline> newFeline(int height, int weight) {
Feline *myFeline = new Feline(height, weight);
return myFeline;
}
第二,让f2指向newFeline的返回值,不要改变f2的内容,如下所示:
Feline *newFeline(int height, int weight) {
Feline *myFeline = new Feline(height, weight);
return myFeline;
}
Feline *f2;
f2 = newFeline(10, 100);
Feline *f2 = newFeline(10, 100);
std::unique_ptr<Feline> newFeline(int height, int weight) {
Feline *myFeline = new Feline(height, weight);
return myFeline;
}
最好是写在一行上,如下所示:
Feline *newFeline(int height, int weight) {
Feline *myFeline = new Feline(height, weight);
return myFeline;
}
Feline *f2;
f2 = newFeline(10, 100);
Feline *f2 = newFeline(10, 100);
std::unique_ptr<Feline> newFeline(int height, int weight) {
Feline *myFeline = new Feline(height, weight);
return myFeline;
}
或者使用C++11自动关键字:
auto f2 = newFeline(10,100);
为了防止内存泄漏,最好让New猫科动物向猫科动物返回一个独特的\u ptr,如下所示:
Feline *newFeline(int height, int weight) {
Feline *myFeline = new Feline(height, weight);
return myFeline;
}
Feline *f2;
f2 = newFeline(10, 100);
Feline *f2 = newFeline(10, 100);
std::unique_ptr<Feline> newFeline(int height, int weight) {
Feline *myFeline = new Feline(height, weight);
return myFeline;
}
std::独特的猫科动物(身高、体重){
猫科动物*猫科动物=新的猫科动物(身高、体重);
返回猫科动物;
}
这样,f2(如果使用自动)也将成为唯一的ptr,当f2超出范围时,分配的猫将自动删除。使用指针返回类型Feline*newFeline(int-height,int-weight)
和return myFeline;
@TimHUK:当问题在回答后被更改时,这真的很痛苦。这会让任何稍后阅读本文的人感到困惑。此外,您的更改使您的代码甚至无法编译,您仍然在您的问题中声称这一点。这条线索上有这么多很棒的答案。我们的想法不过,创建一个唯一的_ptr(当f2超出范围时也会删除它)确实很好。谢谢大家。