2014-08-27 35 views
2

我正在学习C++的教程,并且遇到了一种情况,我们已经定义了一个二维向量类Vector2D,然后我们使它成为另一个类中的成员,我们创建它以便存储老鼠。即,在类定义中动态分配内存有什么作用?

private: 
    Vector2D* m_mousePosition; 

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

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

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

它的工作原理。但是,当我关闭该程序时,它会随着此更改而挂起,我想知道是否不删除内存正在导致此问题。

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

+0

,这个问题就有关使用new关键字的一个伟大的回答: [1]:http://stackoverflow.com/questions/655065/when-should-i-use-the-new-keyword -in-c – Logar 2014-08-27 11:29:26

回答

3

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

Vector2D m_mousePosition; 

为了回答您的具体问题:

第一个声明声明了一个指向对象的指针,但不创建一个对象,或者初始化该指针指向任何事情。使用这个无效指针会导致未定义的行为;如果你幸运就会崩溃,如果你不走运,那么任意的错误行为。

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

+0

谢谢 - 很清楚。我将其更改为一个简单的数据成员,并更改了相关的函数调用,似乎都在工作:) – user2647227 2014-08-27 12:37:07

1

死机很可能是由调试器提醒你内存泄漏引起的。

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