int* test( )
{
int a = 5;
int* b = &a;
return b;
}
test
的结果会是bad pointer
吗?据我所知,应该删除,然后b
会变成混乱的指针,对吗?
如何处理更复杂的事情,而不是一个int指针,但是对于一个有20个成员的类来说呢?
答案 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。有几次,我以为我需要它,但最终想出了一个更清洁的设计,消除了这个要求。