C++指向对象的指针

Ton*_*ion 23 c++ pointers object

在C++中,您是否始终使用new关键字初始化指向对象的指针?

或者你也可以这样做:

MyClass *myclass;

myclass->DoSomething();
Run Code Online (Sandbox Code Playgroud)

我以为这是在堆栈而不是堆上分配的指针,但由于对象通常是堆分配的,我认为我的理论可能有问题?

请指教.

小智 37

不,你可以有指向堆栈分配对象的指针:

MyClass *myclass;
MyClass c;
myclass = & c;
myclass->DoSomething();
Run Code Online (Sandbox Code Playgroud)

当使用指针作为函数参数时,这当然很常见:

void f( MyClass * p ) {
    p->DoSomething();
}

int main() {
    MyClass c;
    f( & c );
}
Run Code Online (Sandbox Code Playgroud)

不管怎样,必须始终初始化指针.你的代码:

MyClass *myclass;
myclass->DoSomething();
Run Code Online (Sandbox Code Playgroud)

导致可怕的情况,未定义的行为.


Nav*_*een 23

不,你不能这样做,MyClass *myclass将定义一个指针(指针的内存在堆栈上分配),它指向一个随机的内存位置.尝试使用此指针将导致未定义的行为.

在C++中,您可以在堆栈或堆上创建对象,如下所示:

MyClass myClass;
myClass.DoSomething();
Run Code Online (Sandbox Code Playgroud)

上面将在堆栈上分配myClass(这个术语不是我认为的标准,但我是为了清晰使用).当myClass变量超出范围时,为对象分配的内存将自动释放.

分配内存的其他方法是做一个new.在这种情况下,你必须通过delete自己来照顾释放记忆.

MyClass* p = new MyClass();
p->DoSomething();
delete p;
Run Code Online (Sandbox Code Playgroud)

记住这delete部分,否则会有内存泄漏.

我总是喜欢尽可能使用堆栈分配的对象,因为我不必为内存管理烦恼.


Joh*_*ski 10

如果你想要堆栈上的对象,试试这个:

MyClass myclass;
myclass.DoSomething();
Run Code Online (Sandbox Code Playgroud)

如果需要指向该对象的指针:

MyClass* myclassptr = &myclass;
myclassptr->DoSomething();
Run Code Online (Sandbox Code Playgroud)