C ++:指针和范围

时间:2010-04-30 16:19:15

标签: c++ pointers

int* test( )
{
    int a = 5;
    int* b = &a;
    return b;
}

test的结果会是bad pointer吗?据我所知,应该删除,然后b会变成混乱的指针,对吗?

如何处理更复杂的事情,而不是一个int指针,但是对于一个有20个成员的类来说呢?

4 个答案:

答案 0 :(得分:7)

您要返回的内容是“dangling pointer”。 a是在堆栈上分配的局部变量,一旦超出范围,它就不再可用(这与垃圾收集完全不同)。尝试使用对test()的调用结果将是未定义的行为。

另一方面,如果你没有在堆栈上分配a - (int *a = new int(5);),那么int *b = a; return b;就可以了,虽然不如{return new int(5)好1}}。但是,如果稍后没有正确free结果,则会发生内存泄漏。

答案 1 :(得分:5)

是的,它是指向不再存在的东西的指针,局部变量称为a。无论是一个int,一个数组,一个类的实例都没有区别。并且c ++没有垃圾收集。

在这种情况下,在许多其他情况下,您当然应该返回一份副本:

int test( )
{
    int a = 5;
    return a;
}

对于类和内置类型都是如此。

答案 2 :(得分:2)

在这种情况下,指针b指向从堆栈分配的实体。一旦此函数返回,该内存将可供调用进程使用。

如果你需要创建一个比创建它的进程更长的对象,你需要使用malloc()new从堆中获取一块内存,并记住{ {1}}或free稍后。

答案 3 :(得分:0)

是的,这会给一个悬垂的指针。如果您希望值保持不变,那么您有几种可能性。一个是因为你显然真的想要返回一个值,所以要做到这一点 - 返回值而不是指针。另一种方法是分配涉及new的对象,并返回指向该动态分配空间的指针。这使得删除对象成为调用者的责任,但这会导致内存泄漏等。

最后,您通常想要确定变量真正需要的范围,并让它拥有该范围的某些东西(通常是一个对象),因此它将在进入范围时自动创建,并且在退出范围时自动销毁。

如果你不能这样做,你仍然需要找出谁“拥有”该对象,并将负责根据需要销毁它。偶尔难以确定,你需要像引用计数指针一样来跟踪事物。至少根据我的经验,这些使用频率比实际应用的频率高得多。我几乎和AT& T之外的任何人一样编写C ++,并且还没有需要shared_ptr。有几次,我以为我需要它,但最终想出了一个更清洁的设计,消除了这个要求。