如何在C ++中将局部变量转换为指针?

时间:2010-11-01 18:37:47

标签: c++ pointers

我有一个变量是一个对象:

Foo x;

我需要调用一个需要Foo *的函数。我如何从Foo转换为Foo *。

我知道这不起作用:

Foo* y = &x;
o->setFoo(y);

因为“ x ”是一个局部变量,所以它将被销毁并且我给出的指针将指向任何内容。

我该怎么办?

注意:我无法修改变量a的功能或类型!

4 个答案:

答案 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未删除它,则会发生内存泄漏。