在类定义中动态分配内存有什么影响?

时间:2014-08-27 11:26:05

标签: c++ pointers

我正在学习学习C ++的教程,并且遇到了我们定义了一个二维向量类Vector2D的情况,然后我们将它作为我们创建的另一个类的成员存储鼠标的位置。即,

private:
  Vector2D* m_mousePosition;

现在,当我这样做,并尝试稍后更新鼠标位置时,我在Xcode中得到一个错误,指向该m_mousePosition对象的空指针。我无法弄清楚为什么这个指针为空,但这是一个不同的问题。

我想出了一个解决方案,那就是为这个成员指针显式分配内存。在这种情况下,我写道:

private:
  Vector2D* m_mousePosition = new Vector2D(0, 0);

它有效。但是,当我关闭程序时,它会挂起这个更改,我想知道是否不删除内存导致问题。

所以问题是,以这两种不同的方式声明成员指针之间有什么区别?具体来说,使用new

会产生什么影响

2 个答案:

答案 0 :(得分:3)

你几乎肯定不想要指针或new。一个简单的数据成员应该做你想做的事情:

Vector2D m_mousePosition;

回答您的具体问题:

第一个声明声明一个指向对象的指针,但不创建对象,或初始化指向任何指针的指针。使用此无效指针将给出未定义的行为;如果你很幸运会发生崩溃,如果你运气不好则会出现任意的错误行为。

第二个声明指定应该通过动态创建对象来初始化指针,并将指针设置为指向该指针。这会导致内存泄漏,因为需要删除动态对象。修复泄漏并不是完全简单的(您需要smart pointer或谨慎应用Rule of Three),但幸运的是,您不必:只使用上述数据成员。 / p>

答案 1 :(得分:1)

挂起很可能是由调试程序引起内存泄漏引起的。

对于在运行时与对象初始化相关联的动态任务,您应该使用constructors and destructors