是否可以在不分配内存的情况下使用引用运算符(->)调用函数。我在某些情况下尝试了这段代码
Foo *fooObject;
fooObject->someFunction;
我对这件事感到困惑。这在 Dev C++ 中运行良好,但在 Visual 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
您可以在没有实际存在实例的情况下在类上调用静态函数,但是这是通过使用::
符号来完成的,然后该函数在任何特定实例的范围之外运行 - 类的静态成员函数没有隐式this
指针:
class Foo {
public:
static void someFunction(void) {std::cout << "BOO!\n";};
};
...
int main(...) {
Foo::someFunction();
return 0;
}
[class-static] 中的标准规定:“可以使用类成员访问语法来引用静态成员,在这种情况下,始终评估对象表达式。”
与此相反,Microsoft 文档指出: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();