在不使用c ++中的对象分配的情况下调用函数

时间:2013-05-07 15:14:37

标签: visual-c++ object dev-c++

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

Foo *fooObject;
fooObject->someFunction;

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

2 个答案:

答案 0 :(得分:2)

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

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

以下语法......

fooObject->func();

相当于

(*fooObject).func()

为了能够*fooObjectfooObject指向的对象必须存在。

在您的代码中

Foo *fooObject;

悬空指针,因为您没有将其指向对象。指针值可能为NULL或指向某个完全随机的内存块:为了尊重它会导致问题,因为无法保证您所引用的内容......这称为"未定义的行为& #34;

要为对象分配内存,可以在堆栈上执行此操作

Foo fooObject;

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

Foo *fooObjectPTR = &fooObject;

但请注意,堆栈上分配的对象只有在范围内时才存在。当它超出范围时,它会被破坏,你的指针将再次成为一个悬空指针,所以不能使用它。

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

Foo *fooObjectPTR = new Foo();

如果在堆上进行分配,则必须谨慎使用delete

以后释放已分配的内存

答案 1 :(得分:1)

您可以在没有实例存在的情况下调用类上的静态函数,但是这可以通过使用::表示法来完成,然后该函数在范围之外的任何特定实例中运行 - 静态成员函数一个类没有隐式this指针:

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

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

[class-static]中的标准状态:“静态成员可以 使用类成员访问语法引用,在这种情况下是object-expression 总是被评估。“

与此相反,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();