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)