【问题标题】:Proper way to push_back pointer to a vectorpush_back 指向向量的指针的正确方法
【发布时间】:2018-11-25 16:12:52
【问题描述】:

由于使用指针向量的类的构造函数,我有一个ERROR: LeakSanitizer: detected memory leaks

这里我只是我的代码。


问题.h

class Problem {
 protected:
    std::vector<const Object*> pointer_vector;

 public:
    // Constructor
    Problem();
};

Problem.cc

Problem::Problem() {
    this->pointer_vector.push_back(new Object(parameter_list_1));
    this->pointer_vector.push_back(new Object(parameter_list_2));
    // here I just want to push back the pointer into the vector
}

因为我的代码仍然有效。但正如我提到的,我得到了ERROR: LeakSanitizer: detected memory leaks

我认为我在 push_back 上做错了,我正在询问正确的方法。
问题是我想问一些通用的方法来解决这个问题。喜欢
如何使用raw pointer 改进此代码。

因为我认为我们肯定有很好的方法来解决这个问题,并且没有找到可能的重复项。如果您需要详细的错误报告,我会添加它们。

谢谢!

【问题讨论】:

  • 显示minimal reproducible example。您显示的代码中没有双重释放。问题出在您未显示的代码中。
  • std::vector&lt;Object&gt; 对你来说可能已经足够了。否则std::vector&lt;std::unique_ptr&lt;const Object&gt;&gt;.
  • 好的。我删除了这里不相关的东西。感谢您的建议。

标签: c++ pointers memory-leaks


【解决方案1】:

不要想太多。

您的对象中的所有内容似乎都被分配在那里,所以使用智能指针:

std::vector<std::unique_ptr<Object>> pointer_vector;

【讨论】:

  • 如果没有必要,为什么还要自己处理内存?这就是智能指针的重点,确保没有内存泄漏。
  • 让我猜猜... 有愚蠢规则的学校作业? :)
【解决方案2】:

您使用new 创建的每个对象在某些时候都必须是deleteed。这样做是你的责任。在您的情况下,最简单的解决方案是将其添加到您的 Problem 类的析构函数中。

Problem::~Problem() {
    for (auto ptr : pointer_vector)
        delete ptr;
}

如果您曾经从向量中删除对象,则必须确保它们也是deleted。

请注意:然而,正确的方法是使用智能指针,正如马蒂厄在他的回答中已经说过的那样。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-04
    • 1970-01-01
    相关资源
    最近更新 更多