【发布时间】: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