我有一个变量是一个对象:
Foo x;
我需要调用一个需要Foo *的函数。我如何从Foo转换为Foo *。
我知道这不起作用:
Foo* y = &x;
o->setFoo(y);
因为“ x ”是一个局部变量,所以它将被销毁并且我给出的指针将指向任何内容。
我该怎么办?
注意:我无法修改变量a的功能或类型!
答案 0 :(得分:6)
如果定义了适当的拷贝构造函数,
o->setFoo(new Foo(x));
但是o
的析构函数应该删除x
(如果已经设置了setFoo
,那么它也应该被删除。
注意:定义析构函数是不够的 还需要定义复制构造函数/赋值运算符,并且:
参见第4条规则的解释。
如果你根本无法触及o
的类定义,那么你需要非常小心内存分配/释放,这样你就不会泄漏内存。
答案 1 :(得分:2)
您应该使用new
关键字在堆上进行分配:
Foo* y = new Foo;
o->setFoo(y);
虽然您稍后需要管理删除Foo,否则会导致内存泄漏。
答案 2 :(得分:2)
为了给出最准确的答案,有关o
是否应该管理所提供Foo的生命周期的信息,如果不是,则需要提供o
的生命周期。< / p>
首先,这可以正常工作,这取决于提供的Foo将采取什么措施。
我知道这不起作用:
Foo* y = &x;
o->setFoo(y);
因为“x”是一个局部变量,所以它将被销毁并且我给出的指针将指向任何内容。
好的,我们可以说o
的类型为Bar
1 Bar管理Foo - 即。将删除Foo。
Bar会被销毁,这样做它应该做一些事情,以便删除Foo 根据您需要使用Foo进行配置,您可以选择简单的
{
std::auto_ptr<Bar> o = new Bar();
o->setFoo(new Foo());
o->DoStuff();
}
或者有点复杂
{
std::auto_ptr<Foo> y = new Foo(...);
y->config();
o->setFoo(y.release());
}
2 Bar不管理Foo - 即。尝试删除Foo
如果Bar没有管理Foo那么那就是你的工作,但很可能Bar应该在Foo之前被销毁
2.1假设Bar仅用于当前范围
这里Bar将在Foo之前被摧毁
{
Foo y;
std::auto_ptr<Bar> o = new Bar();
o->setFoo(&y);
o->DoStuff();
}
2.2假设Bar仅在内部范围内使用
SomeFunc( Foo *y );
{
std::auto_ptr<Bar> o = new Bar();
o->setFoo(y);
o->DoStuff();
}
{
Foo y;
SomeFunc( &y );
}
2.3假设您有将在不同范围内使用的Bar
std::auto_ptr<Foo> y = new Foo();
std::auto_ptr<Bar> o = new Bar();
{
o->setFoo(y.get());
}
{
o->DoStuff();
}
然后可以根据您如何处理多个Bar的Foo(包括容器等)来提供更多示例。
答案 3 :(得分:1)
您可以使用new(例如
)动态分配类Foo
的对象
o->setFoo(new Foo);
请注意,您必须考虑此对象的所有权,因为如果setFoo
未删除它,则会发生内存泄漏。