C++:指针语法之间的差异

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),然后成功传递afoo.但是,如果我不这样做a = &bfoo尝试读取指向的(不存在的)对象a,则会导致运行时错误.

此外,如果以上是正确的,那么我认为我可以成功通话foo(&b);.

我对么?

谢谢!

Alo*_*ave 5

是的,你的理解是正确的.

 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)

请注意,尽可能避免动态分配总是更好,如果必须这样做,请使用智能指针而不是原始指针.

  • @ Di-0xide:你应该.RAII是C++最强大和最好的功能之一. (2认同)