是否可以在不分配内存的情况下使用引用操作符( - >)调用函数。 我在某些情况下调用一个函数,而不用在C++中分配对象
Foo *fooObject;
fooObject->someFunction;
我对这个事情的困惑尝试这种代码。这在Dev C++中运行良好,但在visual C++中崩溃。
是否可以在不分配内存的情况下使用引用操作符( - >)调用函数。 我在某些情况下调用一个函数,而不用在C++中分配对象
Foo *fooObject;
fooObject->someFunction;
我对这个事情的困惑尝试这种代码。这在Dev C++中运行良好,但在visual C++中崩溃。
不,不可能使用 - >没有分配内存,因为这个操作符试图取消引用一个指向对象的指针......因此该对象必须存在。
指向的对象必须存在...这是“内存分配”,这可以在堆栈或堆上完成。
以下语法...
fooObject->func();
相当于
(*fooObject).func()
所以能够做到*fooObject
,目标指向fooObject
必须存在。
在你的代码
Foo *fooObject;
是一个悬摆指针因为你没有在一个对象指向它。指针值可能为NULL或指向一些完全随机的内存块:尊重它会导致你的问题,因为不能保证你所引用的内容......这被称为“未定义的行为”。
分配内存为你的对象,你可以做到这一点栈这样
Foo fooObject;
然后,您可以,如果你喜欢,使用指针的对象上...
Foo *fooObjectPTR = &fooObject;
但请注意,分配给堆栈的对象只会在范围内存在。当它超出范围时,它会被销毁,并且你的指针会再次成为悬挂指针,所以不能使用它。
或者你也可以在堆中分配这样
Foo *fooObjectPTR = new Foo();
如果您在堆上分配,你一定要小心,以释放后使用delete
你可以调用静态函数分配的内存类实际上不存在实例,但是这是通过使用::
表示法来完成的,然后该函数在范围外运行任何特定实例 - 类的静态成员函数没有隐式指针:
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();
标准对此有何评论: “一个后缀表达式,后跟一个点'.'或者一个箭头' - >'[]然后后跟一个id表达式,是一个后缀表达式,在点或箭头之前的后缀表达式被计算;”带注脚“如果评估类成员访问表达式,则即使结果不必确定整个后缀表达式的值,也会发生子表达式评估,例如,如果id表达式表示静态成员**,则会进行子表达式评估。 [?expr.ref]/1 – dyp 2013-05-07 16:06:40
也许更重要的是(?)是[class.static],其中指出“可以使用类成员访问语法引用静态成员,在这种情况下,总是对对象表达式进行评估”。我会更新我的答案。 – icabod 2013-05-07 16:28:03
这不是有效的代码(未定义行为实际上)它没有意义,因为fooObject(指向Foo)没有被初始化,它可以指向任何地方,如果你不想在堆上分配内存,你可以在堆栈中进行:Foo fooObj; fooObj.someFunction() – maverik 2013-05-07 15:19:05
“可能”是什么意思?你可以编写它(你的程序可以被编译为“格式良好”),但是maverik认为它是未定义的行为 – dyp 2013-05-07 15:32:29