没有 new 关键字并使用指针的 C++ 对象初始化 [重复]

Posted

技术标签:

【中文标题】没有 new 关键字并使用指针的 C++ 对象初始化 [重复]【英文标题】:C++ object initialization without new keyword and using pointers [duplicate] 【发布时间】:2015-03-02 16:40:39 【问题描述】:

根据我在 c++ 中的知识,在使用指针初始化对象时,我们必须使用 new 关键字。但是在下面的例子中,指针并没有指向一个用'new'初始化的对象,但是我们仍然可以调用不修改成员变量的方法。

#include <iostream>
using namespace std;
class B

    public:

       void display()
          cout<<"Content of base class.\n"; 

;


int main()

    B *b; // line p : not initialized with 'new' 

    b->display(); //line q: this prints Content of base class

    return 0;

在上面的代码中,我很困惑为什么我可以在 main 方法中调用第 q 行中的方法。还有为什么当我尝试访问成员变量时会出错。 提前致谢。

【问题讨论】:

嗯,没有通过this 访问B 的内部结构,所以你侥幸逃脱了。一旦你在display 中对对象的内部进行了操作,你就会遇到一些内存冲突 【参考方案1】:

您正在调用未定义的行为。在这种情况下,大多数编译器永远不会尝试访问“this”中的任何内容,您将侥幸逃脱。但该标准并不保证这会奏效。代码被破坏了。

这里有更多的讨论;他们谈论空指针,但就我们的目的而言,垃圾指针几乎相同。 When does invoking a member function on a null instance result in undefined behavior?

【讨论】:

【参考方案2】:

之所以有效,是因为在幕后B::display() 实现为display(B* this),而您没有对this 做任何事情。

如果您尝试使用this-&gt; 访问任何成员变量,您将看到真正的问题。

【讨论】:

【参考方案3】:

你很幸运能够在没有初始化对象的情况下调用非静态函数。在这种情况下,指针 b 指向一些垃圾,幸运的是你得到了想要的结果。您将无法访问或修改(即使它们是公共的)数据成员,因为没有为它们分配内存

【讨论】:

以上是关于没有 new 关键字并使用指针的 C++ 对象初始化 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何初始化动态对象数组

智能指针

C++之对象指针

c++重用和模板

new和delete,p150

C++ 浅析智能指针