mirror of
https://github.com/moses-smt/mosesdecoder.git
synced 2024-09-11 19:27:11 +03:00
Fix memory leaks in extractor.
This commit is contained in:
parent
c5c128f263
commit
087756b8c3
@ -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);
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -35,7 +35,7 @@ private:
|
||||
|
||||
public:
|
||||
Data(Scorer& sc);
|
||||
~Data() {};
|
||||
~Data();
|
||||
|
||||
inline void clear() {
|
||||
scoredata->clear();
|
||||
|
@ -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
54
mert/ScopedVector.h
Normal 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_
|
@ -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_];
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user