0

是否可以在不分配内存的情况下使用引用运算符(->)调用函数。我在某些情况下尝试了这段代码

Foo *fooObject;
fooObject->someFunction;

我对这件事感到困惑。这在 Dev C++ 中运行良好,但在 Visual C++ 中崩溃。

4

2 回答 2

2

不,永远不可能使用 -> 而不分配内存,因为该运算符试图取消引用指向对象的指针......因此该对象必须存在。

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

以下语法...

fooObject->func();

相当于

(*fooObject).func()

所以为了能够做到*fooObject,所指向的对象fooObject必须存在。

在您的代码中

Foo *fooObject;

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

要为您的对象分配内存,您可以像这样在堆栈上进行

Foo fooObject;

然后,如果您愿意,可以使用指向对象的指针...

Foo *fooObjectPTR = &fooObject;

但请注意,分配在堆栈上的对象仅在其范围内时才存在。当它超出范围时,它会被销毁,并且您的指针将再次成为悬空指针,因此不得使用。

或者你可以像这样在堆上分配

Foo *fooObjectPTR = new Foo();

如果在堆上分配,则必须小心稍后使用释放分配的内存delete

于 2013-05-07T15:25:47.280 回答
1

您可以在没有实际存在实例的情况下在类上调用静态函数,但是这是通过使用::符号来完成的,然后该函数在任何特定实例的范围之外运行 - 类的静态成员函数没有隐式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 –&gt;) that selects a static member function is not evaluated,这意味着以下内容对 VC++ 有效,但在符合标准的 C++ 中无效:

Foo* not_allocated;
not_allocated->someFunction();
于 2013-05-07T15:38:51.873 回答