gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 01:03:17 25 4
gpt4 key购买 nike

我正在学习 C++ 教程,遇到这样一种情况:我们定义了一个二维 vector 类 Vector2D,然后我们将其作为我们创建的另一个类的成员为了存储鼠标的位置。即,

private:
Vector2D* m_mousePosition;

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

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

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

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

那么问题来了,这两种不同的方式声明成员指针有什么区别呢?具体来说,使用new有什么效果?

最佳答案

您几乎可以肯定不希望此处有指针或 new。一个简单的数据成员应该做你想做的事:

Vector2D m_mousePosition;

回答您的具体问题:

第一个声明声明了一个指向对象的指针,但没有创建对象,也没有初始化指针指向任何东西。使用这个无效指针将产生未定义的行为;幸运的话是崩溃,不幸的话是任意错误行为。

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

关于c++ - 在类定义中动态分配内存有什么影响?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25525945/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com