Fix memory leaks in extractor.

This commit is contained in:
Tetsuo Kiso 2011-11-11 19:11:10 +09:00
parent c5c128f263
commit 087756b8c3
8 changed files with 79 additions and 13 deletions

View File

@ -41,7 +41,7 @@ size_t BleuScorer::countNgrams(const string& line, counts_t& counts, unsigned in
void BleuScorer::setReferenceFiles(const vector<string>& referenceFiles)
{
//make sure reference data is clear
_refcounts.clear();
_refcounts.reset();
_reflengths.clear();
_encodings.clear();
@ -57,7 +57,7 @@ void BleuScorer::setReferenceFiles(const vector<string>& referenceFiles)
while (getline(refin,line)) {
//cerr << line << endl;
if (i == 0) {
counts_t* counts = new counts_t(); //these get leaked
counts_t *counts = new counts_t; //these get leaked
_refcounts.push_back(counts);
vector<size_t> lengths;
_reflengths.push_back(lengths);

View File

@ -14,6 +14,7 @@
#include "Types.h"
#include "ScoreData.h"
#include "Scorer.h"
#include "ScopedVector.h"
using namespace std;
@ -88,7 +89,7 @@ private:
typedef map<vector<int>,int,CompareNgrams> counts_t;
typedef map<vector<int>,int,CompareNgrams>::iterator counts_it;
typedef vector<counts_t*> refcounts_t;
typedef ScopedVector<counts_t> refcounts_t;
size_t countNgrams(const string& line, counts_t& counts, unsigned int n);

View File

@ -23,9 +23,18 @@ Data::Data(Scorer& ptr):
TRACE_ERR("Data::score_type " << score_type << std::endl);
TRACE_ERR("Data::Scorer type from Scorer: " << theScorer->getName() << endl);
featdata=new FeatureData;
scoredata=new ScoreData(*theScorer);
};
featdata = new FeatureData;
scoredata = new ScoreData(*theScorer);
}
Data::~Data() {
if (featdata) {
delete featdata;
}
if (scoredata) {
delete scoredata;
}
}
void Data::loadnbest(const std::string &file)
{

View File

@ -35,7 +35,7 @@ private:
public:
Data(Scorer& sc);
~Data() {};
~Data();
inline void clear() {
scoredata->clear();

View File

@ -90,7 +90,7 @@ FeatureStats::FeatureStats()
FeatureStats::~FeatureStats()
{
delete[] array_;
delete [] array_;
};
FeatureStats::FeatureStats(const FeatureStats &stats)
@ -121,7 +121,7 @@ void FeatureStats::expand()
available_*=2;
featstats_t t_ = new FeatureStatsType[available_];
memcpy(t_,array_,featbytes_);
delete array_;
delete [] array_;
array_=t_;
}
@ -201,7 +201,7 @@ void FeatureStats::savebin(std::ofstream& outFile)
FeatureStats& FeatureStats::operator=(const FeatureStats &stats)
{
delete array_;
delete [] array_;
available_ = stats.available();
entries_ = stats.size();
array_ = new FeatureStatsType[available_];

54
mert/ScopedVector.h Normal file
View File

@ -0,0 +1,54 @@
#ifndef SCOPEDVECTOR_H_
#define SCOPEDVECTOR_H_
#include <vector>
template <class T>
class ScopedVector {
public:
typedef typename std::vector<T*>::iterator iterator;
typedef typename std::vector<T*>::const_iterator const_iterator;
ScopedVector() {}
virtual ~ScopedVector() { reset(); }
bool empty() const { return vec_.empty(); }
void push_back(T *e) { vec_.push_back(e); }
void reset() {
for (iterator it = vec_.begin(); it != vec_.end(); ++it) {
delete *it;
}
vec_.clear();
}
void reserve(size_t capacity) { vec_.reserve(capacity); }
void resize(size_t size) { vec_.resize(size); }
size_t size() const {return vec_.size(); }
iterator begin() { return vec_.begin(); }
const_iterator begin() const { return vec_.begin(); }
iterator end() { return vec_.end(); }
const_iterator end() const { return vec_.end(); }
std::vector<T*>& get() { return vec_; }
const std::vector<T*>& get() const { return vec_; }
std::vector<T*>* operator->() { return &vec_; }
const std::vector<T*>* operator->() const { return &vec_; }
T*& operator[](size_t i) { return vec_[i]; }
const T* operator[](size_t i) const { return vec_[i]; }
private:
std::vector<T*> vec_;
// no copying allowed.
ScopedVector<T>(const ScopedVector<T>&);
void operator=(const ScopedVector<T>&);
};
#endif // SCOPEDVECTOR_H_

View File

@ -21,7 +21,7 @@ ScoreStats::ScoreStats()
ScoreStats::~ScoreStats()
{
delete[] array_;
delete [] array_;
};
ScoreStats::ScoreStats(const ScoreStats &stats)
@ -51,7 +51,7 @@ void ScoreStats::expand()
available_*=2;
scorestats_t t_ = new ScoreStatsType[available_];
memcpy(t_,array_,scorebytes_);
delete array_;
delete [] array_;
array_=t_;
}
@ -117,7 +117,7 @@ void ScoreStats::savebin(std::ofstream& outFile)
ScoreStats& ScoreStats::operator=(const ScoreStats &stats)
{
delete array_;
delete [] array_;
available_ = stats.available();
entries_ = stats.size();
array_ = new ScoreStatsType[available_];

View File

@ -211,6 +211,8 @@ int main(int argc, char** argv)
timer.stop("Stopping...");
*/
delete scorer;
return EXIT_SUCCESS;
} catch (const exception& e) {
cerr << "Exception: " << e.what() << endl;