我有这个单例模式,它运行良好。但当我使用valgrind执行程序以检查内存泄漏时,似乎实例从未被销毁。
我的错误在哪里?
头文件
class Stopwords {
private:
static Stopwords* instance;
std::map<std::string,short> diccionario;
private:
Stopwords();
public:
~Stopwords();
public:
static Stopwords* getInstance();
std::map<std::string,short> getMap();
};
.cpp
Stopwords* Stopwords::instance = NULL;
Stopwords::Stopwords() {
diccionario = map<string,short>();
char nombre_archivo[] = "stopwords/stopwords.txt";
ifstream archivo;
archivo.open(nombre_archivo);
string stopword;
while(getline(archivo,stopword,',')) {
diccionario[stopword] = 1;
}
archivo.close();
}
Stopwords::~Stopwords() {
delete instance;
}
Stopwords* Stopwords::getInstance() {
if (instance == NULL) {
instance = new Stopwords ();
}
return instance;
}
map<string,short> Stopwords::getMap(){
return diccionario;
}
这段内容并不相关,但在初始化过程中,我从文件中读取了一些单词,并将它们保存在一个映射实例中。
谢谢
static T *instance
和static T instance
的注意事项。如果 T 本身很大,则前者可能更可取,因为它执行堆分配而不是静态数据分配。这使得可执行映像大小更小,在数据段中仅保留sizeof(T *)
字节,而不是sizeof(T)
字节。 - Josh Greifer