【问题标题】:Will my code cause memory leakage?我的代码会导致内存泄漏吗?
【发布时间】:2013-06-01 18:49:41
【问题描述】:

我有这个遍历向量的 for 循环。 然后它检查给定的名称是否等于模型的名称。

最后它创建一个指针并返回它。现在我的问题是,如果我不删除指针,是否会有任何内存泄漏?

Model3D* ModelMemory::GetModel(char* name)
{
   for (std::vector<Model3D*>::reverse_iterator it = mModels->rbegin();it != mModel->rend();it++)
    {
        Model3D *model = *it;
        if (model->GetName() == name)
        {
             return model;
        }
    }
}

感谢您的帮助!

--编辑--

所以我的目标是将我所有的 3d 模型(存储在 Model3D 类中)存储在一个向量中, 这样我以后可以使用 Model3D 的名称检索它。 有没有更好的方法来做到这一点?因为看起来我的编程方式不太好……

【问题讨论】:

  • 我猜这完全不正确 - 你为什么要比较指针?
  • 如果 GetName() 返回一个为 char* 实现 == 的对象(比如 std::string),它可能是正确的。
  • 我将所有模型存储在一个向量中,当我想检索它们时,通过名称记住它们会更容易。有没有更好的办法?
  • 使用某种映射,例如 std::unordered_map<:string model3d>。它将为您提供一种通过名称访问模型的直接方式。
  • @MatthieuRouget std::unordered_map&lt;std::string, std::shard_ptr&lt;Model3D&gt;&gt; 会是更好的选择。

标签: c++ pointers memory memory-leaks


【解决方案1】:

不,不会有内存泄漏,当然如果你以后删除所有模型。另外,使用 strcmp() 比较两个字符串

【讨论】:

  • 或者把名字作为对常量std::string的引用
  • @WouterStandaert 只要它没有被删除,你就可以了。我建议您切换到使用智能指针以避免在对象被删除后访问该对象的可能性,否则您将面临未定义行为的风险。
【解决方案2】:

您没有动态分配任何内存。这是静态分配

Model3D *model = *it;

并且当这个变量的上下文块结束时(即当你从这个方法返回时)它会被销毁。它只是静态分配的指针。

动态分配是使用new 运算符完成的,没有。

检查泄漏的简单规则是每个new 都有delete

您可以使用valgrind 终端工具检查您的内存泄漏。

【讨论】:

  • 它将一个指针值分配给一个具有自动存储持续时间的变量。这与 static storage duration 不同,后者是 static allocation 可以解释的。
  • 上下文块结束时指针将不会被删除。它将被销毁,就像任何其他变量一样;但是指针的析构函数什么都不做。
  • 我的意思不是删除指针的引用对象。破坏听起来更好,谢谢,已编辑。
猜你喜欢
  • 2012-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多