没有 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->
访问任何成员变量,您将看到真正的问题。
【讨论】:
【参考方案3】:你很幸运能够在没有初始化对象的情况下调用非静态函数。在这种情况下,指针 b 指向一些垃圾,幸运的是你得到了想要的结果。您将无法访问或修改(即使它们是公共的)数据成员,因为没有为它们分配内存
【讨论】:
以上是关于没有 new 关键字并使用指针的 C++ 对象初始化 [重复]的主要内容,如果未能解决你的问题,请参考以下文章