2013-05-07 52 views
0

是否可以在不分配内存的情况下使用引用操作符( - >)调用函数。 我在某些情况下调用一个函数,而不用在C++中分配对象

Foo *fooObject; 
fooObject->someFunction; 

我对这个事情的困惑尝试这种代码。这在Dev C++中运行良好,但在visual C++中崩溃。

+1

这不是有效的代码(未定义行为实际上)它没有意义,因为fooObject(指向Foo)没有被初始化,它可以指向任何地方,如果你不想在堆上分配内存,你可以在堆栈中进行:Foo fooObj; fooObj.someFunction() – maverik 2013-05-07 15:19:05

+0

“可能”是什么意思?你可以编写它(你的程序可以被编译为“格式良好”),但是maverik认为它是未定义的行为 – dyp 2013-05-07 15:32:29

回答

2

不,不可能使用 - >没有分配内存,因为这个操作符试图取消引用一个指向对象的指针......因此该对象必须存在。

指向的对象必须存在...这是“内存分配”,这可以在堆栈或堆上完成。

以下语法...

fooObject->func(); 

相当于

(*fooObject).func() 

所以能够做到*fooObject,目标指向fooObject必须存在。

在你的代码

Foo *fooObject; 

是一个悬摆指针因为你没有在一个对象指向它。指针值可能为NULL或指向一些完全随机的内存块:尊重它会导致你的问题,因为不能保证你所引用的内容......这被称为“未定义的行为”

分配内存为你的对象,你可以做到这一点栈这样

Foo fooObject; 

然后,您可以,如果你喜欢,使用指针的对象上...

Foo *fooObjectPTR = &fooObject; 

但请注意,分配给堆栈的对象只会在范围内存在。当它超出范围时,它会被销毁,并且你的指针会再次成为悬挂指针,所以不能使用它。

或者你也可以在堆中分配这样

Foo *fooObjectPTR = new Foo(); 

如果您在堆上分配,你一定要小心,以释放后使用delete

+0

我认为这会是bett呃,说你不能使用 - >除非你的指针指向一个有效的对象。您可以将您的指针分配给基于堆栈的变量。 Foo * fooPTR; Foo foo_stk_obj; fooPTR =&foo_stk_obj; – Freddy 2013-05-07 15:29:02

+0

@Freddy ...是的,通过“分配记忆”来表达你的意思......我的意思是堆或堆栈,但你说得对,它可以更清晰......更新答案,谢谢 – Jimbo 2013-05-07 15:31:27

1

你可以调用静态函数分配的内存类实际上不存在实例,但是这是通过使用::表示法来完成的,然后该函数在范围外运行任何特定实例 - 类的静态成员函数没有隐式指针:

class Foo { 
public: 
    static void someFunction(void) {std::cout << "BOO!\n";}; 
}; 

... 
int main(...) { 
    Foo::someFunction(); 
    return 0; 
} 

中的标准状态〔类静态]:“A静态构件可以 被称为使用类的成员访问语法,在这种情况下,对象的表达 总是被判断。“

与此相反,Microsoft documentation状态:The left side of a member-selection operator (. or –>) that selects a static member function is not evaluated,这意味着以下适用于VC++,但不符合标准的C++:

Foo* not_allocated; 
not_allocated->someFunction(); 
+1

标准对此有何评论: “一个后缀表达式,后跟一个点'.'或者一个箭头' - >'[]然后后跟一个id表达式,是一个后缀表达式,在点或箭头之前的后缀表达式被计算;”带注脚“如果评估类成员访问表达式,则即使结果不必确定整个后缀表达式的值,也会发生子表达式评估,例如,如果id表达式表示静态成员**,则会进行子表达式评估。 [?expr.ref]/1 – dyp 2013-05-07 16:06:40

+0

也许更重要的是(?)是[class.static],其中指出“可以使用类成员访问语法引用静态成员,在这种情况下,总是对对象表达式进行评估”。我会更新我的答案。 – icabod 2013-05-07 16:28:03

相关问题