【发布时间】:2017-08-13 22:54:30
【问题描述】:
我对 C++ 有点陌生,并且我能够毫无错误地运行我的代码,但是,当我通过 Valgrind 运行它时,我遇到了内存泄漏,而且我一辈子都做不到似乎弄清楚我在哪里泄漏!这是我的错误信息:
==22902== in use at exit: 72,728 bytes in 2 blocks
==22902== total heap usage: 4 allocs, 2 frees, 73,816 bytes allocated
==22902==
==22902== 24 bytes in 1 blocks are definitely lost in loss record 1 of 2
==22902== at 0x4C2E80F: operator new[](unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==22902== by 0x401086: Bar::Bar(int, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int) (Bar.cpp:10)
==22902== by 0x400F76: main (Foo_main.cpp:20)
我有一个类 Foo,它被用作 Bar 类的“附件”。 Bar 继承自 foo。它有两个私有成员id_和name_,析构函数和use()在头文件中被声明为virtual。
#include "Foo.h"
#include<iostream>
using std::cout;
using std::endl;
using std::string;
Foo::Foo(int id, const string& name) :
id_(id),
name_(name){}
Foo::~Foo() {}
int Foo::id() const { return id_; }
string Foo::name() const { return name_; }
void Foo::use() const {
cout << "Using Foo #" << id_ << ", " << name_ << endl;
}
Bar 有两个私有成员,num_attachments_ (unsigned int) 和 attachments_ (Foo**)
#include "Bar.h"
#include <iostream>
using std::cout;
using std::endl;
Bar::Bar(int id, const std::string& name, unsigned int num_attachments) :
Foo(id, name),
attachments_(new Foo*[num_attachments]),
num_attachments_(num_attachments) {
// explicity null out each entry in the new array
for (unsigned int i=0; i<num_attachments; ++i) {
attachments_[i] = NULL;
}
}
void Bar::use() const {
cout << "Using Bar #" << id() << endl;
for (unsigned int i=0; i<num_attachments_; ++i) {
if (attachments_[i] != NULL) {
attachments_[i]->use();
}
}
}
(注意:我知道的一些不会导致泄漏的代码已被注释掉)。 我怀疑问题出在 Bar 的 use() 函数中,但我不太确定缺少什么!
最后,主要功能如下:
Foo* f = new Bar(1, "foobar", 3);
f->use();
delete f;
当然,我可以根据要求上传整个程序(尽管我觉得问题可能很明显,我只是完全遗漏了一些东西)。任何帮助都会很棒!
【问题讨论】:
-
您缺少一个析构函数,它
deletes 是newed 数组。相当基本。 -
加1。很好,你声明了你的析构函数 virtual!