Qix*_*Qix 1 c++ pointers instantiation call
好吧,所以我最近深入研究了C++并且我已经把所有东西都搞砸了.指针最终开始有意义,直到我应该使用它们,如何正确实现它们等.
然而,有一个关于指针的基本用法的一个小问题,我仍然需要回答.我会直接跳到代码:
具有以下类别A和功能foo(A* bar)......
class A
{}
void foo(A* bar)
{}
Run Code Online (Sandbox Code Playgroud)
......以下电话之间有什么区别foo?
A* a;
A b;
foo(a);
foo(&b);
Run Code Online (Sandbox Code Playgroud)
他们都编译得很好,据我所知,我没有遇到任何问题.
我认为那A b;是在那里实例化的,而A* a;需要创建new(因为它实际上没有创建对象,它只是对潜在A对象进行了4字节的长引用).
我可以,如果我正确地考虑这个,做a = b;(编辑制作a = &b),然后成功传递a给foo.但是,如果我不这样做a = &b并foo尝试读取指向的(不存在的)对象a,则会导致运行时错误.
此外,如果以上是正确的,那么我认为我可以成功通话foo(&b);.
我对么?
谢谢!
是的,你的理解是正确的.
foo(&b);
Run Code Online (Sandbox Code Playgroud)
将已存在的类型对象的地址A作为参数传递给函数foo().
foo(a);
Run Code Online (Sandbox Code Playgroud)
将指向类型的指针A作为函数参数传递.为了能够做任何有意义的事情,它必须指向一个有效的A对象.它可以通过两种方式完成:
在堆栈上分配对象:在堆栈(本地存储)上
创建类型的对象A并使指针a指向此对象:
A* a;
A b;
a = &b;
Run Code Online (Sandbox Code Playgroud)
动态内存分配:
A *a = new A;
Run Code Online (Sandbox Code Playgroud)
但是,一旦你进行动态内存分配,你将不得不记得在使用后显式释放alloated内存,否则你将有内存泄漏:
delete a;
Run Code Online (Sandbox Code Playgroud)
请注意,尽可能避免动态分配总是更好,如果必须这样做,请使用智能指针而不是原始指针.