【问题标题】:deleting vector of empty unique_ptr删除空 unique_ptr 的向量
【发布时间】:2018-07-12 09:54:03
【问题描述】:

我在尝试制作 unique_ptr 的向量时遇到了内存泄漏问题。我试图找出问题出在哪里,最终得到了这段(无意义的)代码(我的代码包含有意义的操作,为简单起见,这里是整数):

class Deleter
{
public:

    void operator()(int* ptr)
    {
        delete ptr;
    }
};

vector<unique_ptr<int, Deleter>> data;

for (int i = 0; i < 10000; i++)
{
    int* temp = NULL;
    unique_ptr<int, Deleter> uptr;
    uptr = unique_ptr<int, Deleter>(temp);

    data.push_back(move(uptr));
    uptr.~unique_ptr();
}

data.~vector();

这段代码有一点内存泄漏,但我很好奇问题出在哪里,谢谢

【问题讨论】:

  • std::unique_ptr 的全部意义在于您通常不会自己进行内存管理。那条鳕鱼的真正目的是什么?
  • 您的显式破坏使代码未定义。您从哪里得到应该调用析构函数的想法?
  • 不要手动调用析构函数,不要将NULL分配给unique_ptr(它们以nullptr开始初始化)
  • 我需要销毁 Allegro 库中指向位图的指针向量。然而,为了删除它们,应该调用一个函数 al_delete_bitmap(pointer to bitmap),这在删除函数中。在我删除所有位图后,留下了一些小的内存空间,我发现即使我使用整数而不是位图,也会留下相同的空间,因为我的代码没有位图问题。在原始代码中没有任何 NULL,而是指向某处的实际指针,如果我忘记用 temp 或其他东西做某事,它就在那里 :)
  • 您从哪里得知uptr.~unique_ptr();data.~vector(); 是必要的或有用的?您对 C++ 对象生命周期的理解似乎大大偏离了。阅读一本好的 C++ 书籍应该有助于解决这个问题。

标签: c++ c++11 vector memory-leaks unique-ptr


【解决方案1】:

如果您不在此代码中分配内存,怎么可能发生内存泄漏?停止手动调用析构函数,它应该修复泄漏。

注意:即使你指定了Deleter 类型,你也不会传递它的实例,只是使用里面的默认构造函数。

#include <memory>

std::vector<std::unique_ptr<int, Deleter>> data;

for (int i = 0; i < 10000; i++)
{
    data.push_back(std::unique_ptr<int, Deleter>(new int(i)));
}

示例:https://wandbox.org/permlink/Kg4XfhwkwxSILwq3

【讨论】:

  • 好建议,但我不确定这是否能回答问题。
  • 一个默认构造的删除器在这里应该没问题,特别是因为该类不包含任何状态。
  • 我分配 NULL 只是因为我想表明我是否真的放入了一些东西并不重要,在我的实际代码中永远不会有 NULL。
  • 我试过你建议的那行,但编译器告诉我这是错误的......
  • E0304 -> 没有函数重载实例 "std::vector<_ty _alloc>::push_back [where _Ty=std::unique_ptr, _Alloc=std::allocator>]" 与参数列表不匹配
猜你喜欢
  • 1970-01-01
  • 2017-10-27
  • 2016-01-17
  • 2020-05-02
  • 1970-01-01
  • 1970-01-01
  • 2016-08-17
  • 2022-01-13
  • 2014-07-21
相关资源
最近更新 更多